【이미지 처리 100개 노크에 도전】Q.22. 히스토그램 조작
사용한 라이브러리
【화상 처리 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;
}
Reference
이 문제에 관하여(【이미지 처리 100개 노크에 도전】Q.22. 히스토그램 조작), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jajagacchi/items/17147e4292faa1cb4245
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
히스토그램의 평균값을 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;
}
Reference
이 문제에 관하여(【이미지 처리 100개 노크에 도전】Q.22. 히스토그램 조작), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jajagacchi/items/17147e4292faa1cb4245텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)