【화상 처리 100개 노크에 도전】Q.7. 평균 풀링

10484 단어 C++이미지 처리

사용한 라이브러리



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

Q.7. 평균 풀링



여기서는 이미지를 그리드 분할 (한 고정 길이의 영역으로 나눕니다)하고, 그 영역 내의 (셀)의 평균값으로 그 영역 내의 값을 채운다. 이와 같이 그리드 분할하여 그 영역 내의 대표값을 구하는 조작을 Pooling(풀링)이라고 부른다. 이러한 풀링 작업은 CNN (Convolutional Neural Network)에서 중요한 역할을합니다.
이것은 다음 식으로 정의됩니다.
v = 1/|R|*Sum_{i in R} v_i
여기서 imori.jpg는 128x128이므로 8x8로 그리드 분할하고 평균 풀링하라.

이것도 간단하네요.
struct RGB
{
    RGB(int r, int g, int b)
    {
        this->r = r;
        this->g = g;
        this->b = b;
    }
    int r, g, b;
};

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

    int N = 16;//分割数
    int P = width / N;

    auto grid_val = [&](int n, int m)//n,m:grid number
    {
        double r = 0, g = 0, b = 0;
        int i0 = P * n;
        int i1 = P * (n + 1);
        int j0 = P * m;
        int j1 = P * (m + 1);
        for(int j=j0; j<j1; j++)
            for (int i = i0; i < i1; i++)
            {
                r += ppm(i, j, 'r')/(double)(P*P);
                g += ppm(i, j, 'g') / (double)(P * P);
                b += ppm(i, j, 'b') / (double)(P * P);
            }
        return RGB(r, g, b);
    };

    for (int j = 0; j < height; j++)
        for (int i = 0; i < width; i++)
        {
            int n = i / P;
            int m = j / P;
            RGB rgb = grid_val(n, m);


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

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



하나 거칠게 하면

하나 세세하게 하면

좋은 웹페이지 즐겨찾기