【이미지 처리 100개 노크에 도전】Q.22. 히스토그램 조작

14297 단어 C++이미지 처리

사용한 라이브러리



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

Q.22. 히스토그램 조작



히스토그램의 평균값을 m0=128, 표준편차를 s0=52가 되도록 조작하라.
이것은 히스토그램의 동적 범위를 변경하는 것이 아니라 히스토그램을 평평하게 변경하는 작업입니다.
평균값 m, 표준 편차 s의 히스토그램을 평균값 m0, 표준 편차 s0으로 변경하려면 다음 식으로 변환한다.

선형 변환에서 원하는 통계를 갖도록 변환하면 됩니다. 부의 값이나 256 이상의 값이 나오므로 각각 0,255로 합니다.
int main()
{
    PPM ppm("imori_dark.pnm");
    int width = ppm.Get_width();
    int height = ppm.Get_height();

    int N = 256;
    std::vector<int> hist(N);
    for (int n = 0; n < N; n++)
    {
        hist[n] = 0;
    }

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


        }
    m /= (double)(width * height * 3);
    m2 /= (double)(width * height * 3);
    double s2 = m2 - m * m;
    double s = sqrt(s2);

    PPM ppm2(width, height);
    double m0 = 128;
    double s0 = 52;
    for (int j = 0; j < height; j++)
        for (int i = 0; i < width; i++)
        {
            double a;
            a = s0 / s * (ppm(i, j, 'r') - m) + m0;
            if (a < 0) a = 0;
            else if (a >= N) a = N - 1;
            ppm2(i, j, 'r') = a;
            hist[a]++;

            a = s0 / s * (ppm(i, j, 'g') - m) + m0;
            if (a < 0) a = 0;
            else if (a >= N) a = N - 1;
            ppm2(i, j, 'g') = a;
            hist[a]++;

            a = s0 / s * (ppm(i, j, 'b') - m) + m0;
            if (a < 0) a = 0;
            else if (a >= N) a = N - 1;
            ppm2(i, j, 'b') = a;
            hist[a]++;



        }
    for (int n = 0; n < N; n++)
    {
        std::cout << n << " " << hist[n] << std::endl;
    }
    ppm2.Flush("out.ppm");




    return 0;
}

좋은 웹페이지 즐겨찾기