【화상 처리 100개 노크에 도전】Q.13. MAX-MIN 필터
사용한 라이브러리
【화상 처리 100개 노크】 독자적인 화상 입출력 클래스를 만든다
Q.13. MAX-MIN 필터
MAX-MIN 필터(3x3)를 구현하라.
MAX-MIN 필터는 필터 내의 화소의 최대 값과 최소값의 차를 출력하는 필터이며, 에지 검출 필터 중 하나이다. 엣지 검출은 화상 내의 선을 검출하는 것으로, 이러한 화상에서 정보를 추출하는 조작을 특징 추출이라고 부른다. 에지 검출은 종종 그레이 스케일 이미지를 필터링합니다.
이런 필터가 있다는 것을 처음 알았습니다. 차이를 취하기 때문에 미분 필터 같은 움직임을 할 것입니다. 역시 엣지 검출에 사용되는 것 같습니다. 미분 필터와 비교하면 어떨까?
Q.10의 메디안 필터를 조금 개조하면 OK.
int main()
{
PPM ppm("imori.pnm");
int width = ppm.Get_width();
int height = ppm.Get_height();
PPM ppm2(width, height);
auto max_min = [&](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++)
{
std::vector<int> list;
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)
{
list.push_back(f[i - di][j - dj]);
}
else
{
list.push_back(0);
}
}
std::sort(list.begin(), list.end());
ret[i][j] = (list[8]-list[0]);
}
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 = max_min(arry);
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
ppm2(i, j, 'r') = arry[i][j];
ppm2(i, j, 'g') = arry[i][j];
ppm2(i, j, 'b') = arry[i][j];
}
ppm2.Flush("out.ppm");
return 0;
}
Reference
이 문제에 관하여(【화상 처리 100개 노크에 도전】Q.13. MAX-MIN 필터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/jajagacchi/items/7dec7c507d1987a3e6ec
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
MAX-MIN 필터(3x3)를 구현하라.
MAX-MIN 필터는 필터 내의 화소의 최대 값과 최소값의 차를 출력하는 필터이며, 에지 검출 필터 중 하나이다. 엣지 검출은 화상 내의 선을 검출하는 것으로, 이러한 화상에서 정보를 추출하는 조작을 특징 추출이라고 부른다. 에지 검출은 종종 그레이 스케일 이미지를 필터링합니다.
이런 필터가 있다는 것을 처음 알았습니다. 차이를 취하기 때문에 미분 필터 같은 움직임을 할 것입니다. 역시 엣지 검출에 사용되는 것 같습니다. 미분 필터와 비교하면 어떨까?
Q.10의 메디안 필터를 조금 개조하면 OK.
int main()
{
PPM ppm("imori.pnm");
int width = ppm.Get_width();
int height = ppm.Get_height();
PPM ppm2(width, height);
auto max_min = [&](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++)
{
std::vector<int> list;
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)
{
list.push_back(f[i - di][j - dj]);
}
else
{
list.push_back(0);
}
}
std::sort(list.begin(), list.end());
ret[i][j] = (list[8]-list[0]);
}
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 = max_min(arry);
for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
ppm2(i, j, 'r') = arry[i][j];
ppm2(i, j, 'g') = arry[i][j];
ppm2(i, j, 'b') = arry[i][j];
}
ppm2.Flush("out.ppm");
return 0;
}
Reference
이 문제에 관하여(【화상 처리 100개 노크에 도전】Q.13. MAX-MIN 필터), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/jajagacchi/items/7dec7c507d1987a3e6ec텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)