RGB -> YCrCb -> RGB
Daniel Jaworski - 23-11-2006 00:12
RGB -> YCrCb -> RGB
Witam!
Piszę program analizujący pewne zagadnienia transformacji obrazów. Jednym z etapów jest konwersja RGB -> YCrCb oraz konwersja odwrotna YCrCb -> RGB.
Algorytmy konwersji napisałem zgodnie wytycznymi na stronie <http://www.fourcc.org/fccyvrgb.php>, <http://www.jpeg.org/public/jfif.pdf> (str. 4) oraz <http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddraw/html/_dxce_converting_between_yuv_and_rgb.asp>
Konwersja zasadniczo działa ale obraz uzyskany w wyniku RGB -> YCrCb -> RGB dość znacznie różni się od oryginału (jest bardziej zielony).
Aby uzyskać obraz taki jak oryginał należy dodać do obrazu wynikowego około 40 do składowej R, -12 do składowej G oraz 36 do składowej B.
Czy to normalne, że obraz wyjściowy istotnie sie różni od oryginału? Czy w tych współczynnikach jest jakiś błąd? Czy to może jakaś specyfika obiektu klasy BufferedImage w języku Java.
Przykładowy kod wygląda tak:
/* konwersja RGB -> YCrCb */ public void generateYCrCbFromInputComposite() { // ... // imgIComp -- to obraz wejściowy wczytany z pliku BMP za pomocą // ImageIO.read(imgFile); // imgIY, imgICr, imgICb -- top obrazy wyjściowe odpowiednio Y, Cr, Cb for (int i = 0; i < imageWidth; i++) { for (int j = 0; j < imageHeight; j++) { int rgb = imgIComp.getRGB(i, j); int r = (rgb & 0x00ff0000) >> 16; // czerwony int g = (rgb & 0x0000ff00) >> 8; // zielony int b = (rgb & 0x000000ff) >> 0; // niebieski int y = clip((int)(0.299 * r + 0.587 * g + 0.114 * b)); int cb = clip((int)(-0.1687 * r - 0.3313 * g + 0.5 * b + 128)); int cr = clip((int)(0.5 * r - 0.4187 * g - 0.0813 * b + 128));
imgIY.setRGB(i, j, y << 8); imgICr.setRGB(i, j, cr << 8); imgICb.setRGB(i, j, cb << 8); } } }
/* konwersja YCrCb -> RGB */ public void generateCompositeFromOutputYCrCb() { // wyjściowy obraz RGB imgOComp = new BufferedImage(imageWidth, imageHeight, BufferedImage.TYPE_3BYTE_BGR); for (int i = 0; i < imageWidth; i++) { for (int j = 0; j < imageHeight; j++) { int y = (imgOY.getRGB(i, j) & 0x0000ff00) >> 8; int cr = (imgOCr.getRGB(i, j) & 0x0000ff00) >> 8; int cb = (imgOCb.getRGB(i, j) & 0x0000ff00) >> 8;
int r = (int)((double)y + 1.402 * (double)(cr - 128)); int g = (int)((double)y - 0.34414 * (double)(cb - 128) - 0.71414 * (double)(cr - 128)); int b = (int)((double)y + 1.772 * (double)(cb - 128));
r = clip(r ); //! 38 g = clip(g ); //! -12 b = clip(b ); //! 38
imgOComp.setRGB(i, j, ((r & 0xff) << 16) | ((g & 0xff) << 8) | ((b & 0xff) << 0)); } } }
-- Daniel
HenJ - 24-11-2006 00:04
Użytkownik "Daniel Jaworski" <danielj_no_spam@poczta.fm> napisał w wiadomości news:ek1ttv$jl$1@news.interia.pl... > Witam! > > Piszę program analizujący pewne zagadnienia transformacji obrazów. > Jednym z etapów jest konwersja RGB -> YCrCb oraz konwersja odwrotna > YCrCb -> RGB. > > Algorytmy konwersji napisałem zgodnie wytycznymi na stronie > <http://www.fourcc.org/fccyvrgb.php>, > <http://www.jpeg.org/public/jfif.pdf> (str. 4) oraz > <http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddraw/html/_dxce_converting_between_yuv_and_rgb.asp> > > Konwersja zasadniczo działa ale obraz uzyskany w wyniku RGB -> YCrCb -> > RGB dość znacznie różni się od oryginału (jest bardziej zielony). > > Aby uzyskać obraz taki jak oryginał należy dodać do obrazu wynikowego > około 40 do składowej R, -12 do składowej G oraz 36 do składowej B.
Jeśli na wyjściu masz inne dane niż na wejściu, mimo że chciałbyś takie same, to może źle zaimplementowałeś algorytm? A może też jest za mało dokładny? Inna sprawa to to, że przestrzenie barw nie muszę się pokrywać, więc idealna konwersja nie jest możliwa. Stąd zwykle stosuje się konwersję poprzez Lab. Poczytaj o przestrzeni barw, może też będą tam lepsze algorytmy: http://semmix.pl/color/indexp.html http://www.brucelindbloom.com/
Pozdr. HenJ
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Konwersja RGB->Grayscale inaczej u Margulisa inaczej u mnie w Photoshopie
=?iso-8859-2?Q?zdj=EAcia?= do internetu: sRGB, adobeRGB czyECI-RGB?
Jak ustawic kolory RGB w monitorze Sony G520?
Dokument RGB nie posiada osadzonego pliku koloru
aparat canon 5D sRGB, RGB i cmyk
wydruk w RGB i przyrost punktu rastrowego
Zdjęcie RGB >> CMYK i co dalej?
Pantone - konwertowanie do CMYK i RGB
Wzornik Pantone Solid in RGB
Filtr medianowy w RGB
zanotowane.pldoc.pisz.plpdf.pisz.planielska.pev.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|