【화상 처리 100개 노크에 도전】Q.39. JPEG 압축 (Step.3) YCbCr 표색계

11631 단어 C++이미지 처리

사용한 라이브러리



【화상 처리 100개 노크】 독자적인 화상 입출력 클래스를 만든다

Q.39. JPEG 압축 (Step.3) YCbCr 표색계



YCbCr 표색형에 있어서, Y를 0.7배로 하여 콘트라스트를 어둡게 해라.

【이미지 처리 100개 노크에 도전】Q.5. HSV 변환 의 코드를 유용했습니다.
struct YCbCr
{
    double Y, Cb, Cr;
};
struct RGB
{
    RGB(int r, int g, int b)
    {
        this->r = r;
        this->g = g;
        this->b = b;
    }
    int r, g, b;
};

YCbCr RGB2YCbCr(const RGB& rgb)
{
    YCbCr ycbcr;
    int R = rgb.r;
    int G = rgb.g;
    int B = rgb.b;

    ycbcr.Y = 0.299 * R + 0.5870 * G + 0.114 * B;
    ycbcr.Cb = -0.1687 * R - 0.3313 * G + 0.5 * B + 128;
    ycbcr.Cr = 0.5 * R - 0.4187 * G - 0.0813 * B + 128;

    return ycbcr;
}
RGB YCbCr2RGB(const YCbCr& ycbcr)
{
    double R, G, B;
    double Y = ycbcr.Y;
    double Cb = ycbcr.Cb;
    double Cr = ycbcr.Cr;
    R = Y + (Cr - 128) * 1.402;
    G = Y - (Cb - 128) * 0.3441 - (Cr - 128) * 0.7139;
    B = Y + (Cb - 128) * 1.7718;
    return RGB(R,G,B);
}

int main()
{
    PPM ppm("imori.pnm");
    int width = ppm.Get_width();
    int height = ppm.Get_height();
    PPM ppm2(width, height);

    for (int j = 0; j < height; j++)
        for (int i = 0; i < width; i++)
        {
            int r = ppm(i, j, 'r');
            int g = ppm(i, j, 'g');
            int b = ppm(i, j, 'b');

            YCbCr ycbcr = RGB2YCbCr(RGB(r, g, b));
            ycbcr.Y *= 0.7;

            RGB rgb = YCbCr2RGB(ycbcr);
            ppm2(i, j, 'r') = rgb.r;
            ppm2(i, j, 'g') = rgb.g;
            ppm2(i, j, 'b') = rgb.b;
        }

    ppm2.Flush("out.ppm");
    return 0;
}

좋은 웹페이지 즐겨찾기