ďťż
 
RGB -> YCrCb -> RGB ďťż
 
RGB -> YCrCb -> RGB
Zobacz wiadomości
 
Cytat
A gdyby tak się wedrzeć na umysłów górę, / Gdyby stanąć na ludzkich myśli piramidzie, / I przebić czołem przesądów chmurę, / I być najwyższą myślą wcieloną. . . Juliusz Słowacki, Kordian
Indeks BCB i MySQL subiekt gt fototapeta
 
  Witamy

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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • effulla.pev.pl
  • comp
    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.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • anielska.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

    Valid HTML 4.01 Transitional

    Free website template provided by freeweblooks.com