【이미지 처리 100개 노크에 도전】Q.15. Sobel 필터
사용한 라이브러리
【화상 처리 100개 노크】 독자적인 화상 입출력 클래스를 만든다
Q.15. Sobel 필터
Sobel 필터(3x3)를 구현하라.
모르는 필터가 있습니다. 기본적으로는 미분 필터이지만, 그라디언트 공간에서 가중치 매끄럽게 한 것일까. 무게를 붙이지 않는 것을 프리윗 필터라고 한다. 커널을 바꿀 뿐.
int main()
{
PPM ppm("imori.pnm");
int width = ppm.Get_width();
int height = ppm.Get_height();
PPM ppm2(width, height);
auto kernel = [&](int i, int j)
{
double ret = 0;
/*if (j == -1)
{
if (i == -1 || i == 1) ret = 1;
else if (i == 0) ret = 2;
}
else if (j == 1)
{
if (i == -1 || i == 1) ret = -1;
else if (i == 0) ret = -2;
}*/
if (i == -1)
{
if (j == -1 || j == 1) ret = 1;
else if (j == 0) ret = 2;
}
else if (i == 1)
{
if (j == -1 || j == 1) ret = -1;
else if (j == 0) ret = -2;
}
return ret;// / 16.;
};
auto conv = [&](const std::vector<std::vector<double>>& f)
{
std::vector < std::vector < double >> ret(width, std::vector<double>(height));
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
ret[i][j] = 0;
}
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
int sum = 0;
for (int di = -1; di <= 1; di++)
for (int dj = -1; dj <= 1; dj++)
{
if (i - di >= 0 && i - di < width && j - dj >= 0 && j - di < height)
{
ret[i][j] += kernel(di, dj) * f[i - di][j - dj];
sum += kernel(di, dj);
}
}
//ret[i][j] /= (double)sum;
}
return ret;
};
std::vector < std::vector < double >> arry(width, std::vector<double>(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');
int y = (std::round)(0.2126 * r + 0.7152 * g + 0.0722 * b);
arry[i][j] = y;
}
arry = conv(arry);
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
int val = abs(arry[i][j]);
if (val > 255) val = 255;
ppm2(i, j, 'r') = val;
ppm2(i, j, 'g') = val;
ppm2(i, j, 'b') = val;
}
ppm2.Flush("out.ppm");
return 0;
}
Reference
이 문제에 관하여(【이미지 처리 100개 노크에 도전】Q.15. Sobel 필터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jajagacchi/items/a187776532796cbf714c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Sobel 필터(3x3)를 구현하라.
모르는 필터가 있습니다. 기본적으로는 미분 필터이지만, 그라디언트 공간에서 가중치 매끄럽게 한 것일까. 무게를 붙이지 않는 것을 프리윗 필터라고 한다. 커널을 바꿀 뿐.
int main()
{
PPM ppm("imori.pnm");
int width = ppm.Get_width();
int height = ppm.Get_height();
PPM ppm2(width, height);
auto kernel = [&](int i, int j)
{
double ret = 0;
/*if (j == -1)
{
if (i == -1 || i == 1) ret = 1;
else if (i == 0) ret = 2;
}
else if (j == 1)
{
if (i == -1 || i == 1) ret = -1;
else if (i == 0) ret = -2;
}*/
if (i == -1)
{
if (j == -1 || j == 1) ret = 1;
else if (j == 0) ret = 2;
}
else if (i == 1)
{
if (j == -1 || j == 1) ret = -1;
else if (j == 0) ret = -2;
}
return ret;// / 16.;
};
auto conv = [&](const std::vector<std::vector<double>>& f)
{
std::vector < std::vector < double >> ret(width, std::vector<double>(height));
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
ret[i][j] = 0;
}
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
int sum = 0;
for (int di = -1; di <= 1; di++)
for (int dj = -1; dj <= 1; dj++)
{
if (i - di >= 0 && i - di < width && j - dj >= 0 && j - di < height)
{
ret[i][j] += kernel(di, dj) * f[i - di][j - dj];
sum += kernel(di, dj);
}
}
//ret[i][j] /= (double)sum;
}
return ret;
};
std::vector < std::vector < double >> arry(width, std::vector<double>(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');
int y = (std::round)(0.2126 * r + 0.7152 * g + 0.0722 * b);
arry[i][j] = y;
}
arry = conv(arry);
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
int val = abs(arry[i][j]);
if (val > 255) val = 255;
ppm2(i, j, 'r') = val;
ppm2(i, j, 'g') = val;
ppm2(i, j, 'b') = val;
}
ppm2.Flush("out.ppm");
return 0;
}
Reference
이 문제에 관하여(【이미지 처리 100개 노크에 도전】Q.15. Sobel 필터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jajagacchi/items/a187776532796cbf714c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)