【화상 처리 100개 노크에 도전】Q.7. 평균 풀링
사용한 라이브러리
【화상 처리 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;
}
하나 거칠게 하면
하나 세세하게 하면
Reference
이 문제에 관하여(【화상 처리 100개 노크에 도전】Q.7. 평균 풀링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jajagacchi/items/6f3b7b6c54463a0e2b09
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
여기서는 이미지를 그리드 분할 (한 고정 길이의 영역으로 나눕니다)하고, 그 영역 내의 (셀)의 평균값으로 그 영역 내의 값을 채운다. 이와 같이 그리드 분할하여 그 영역 내의 대표값을 구하는 조작을 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;
}
하나 거칠게 하면
하나 세세하게 하면
Reference
이 문제에 관하여(【화상 처리 100개 노크에 도전】Q.7. 평균 풀링), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jajagacchi/items/6f3b7b6c54463a0e2b09텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)