영상에서 필요한 정보만 통과시키고 원치않는 정보는 걸러내는 작업
영상의 픽셀값을 직접 이용하는 필터링 방법
주로 마스크 연산을 이용
-OpenCV에서는 공간적 필터링 마스크 크기가 커질 경우 주파수 공간에서의 필터링을 수행함.
사용되는 마스크는 다양한 크기와 모양을 지정할 수 있지만, 대부분 3x3 정방향 필터를 사용한다.
최외곽 픽셀들의 컨볼루션 연산은 가사으이 픽셀들이 있다고 가정하고 진행됨. 대칭되는 픽셀값으로 가정
void copyMakeBorder(InputArray src, OutputArray dst, int top, int bottom, int left, int right,
int borderType, const Scalr& value = Scalar());
void filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel,
Point anchor = Point(-1, -1), double delta = 0, int borderType = BORDER_DEFAULT);
int main()
{
Mat src = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (src.empty()) {
cerr << "Image laod failed!" << endl;
return -1;
}
float data[] = {
-1, -1, 0,
-1, 0, 1,
0, 1, 1
};
Mat kernel(3, 3, CV_32FC1, data);
Mat dst;
filter2D(src, dst, -1, kernel, Point(-1, -1), 125);
imshow("src", src);
imshow("dst", dst);
waitKey();
}
int main()
{
Mat src = imread("rose.bmp", IMREAD_GRAYSCALE);
if (src.empty()) {
cerr << "Image load failed!" << endl;
return -1;
}
imshow("src", src);
Mat dst;
for (int ksize = 3; ksize <= 7; ksize += 2) {
blur(src, dst, Size(ksize, ksize));
String desc = format("Mean: %dx%d", ksize, ksize);
putText(dst, desc, Point(10, 30), FONT_HERSHEY_SIMPLEX, 1.0,
Scalar(255), 1, LINE_AA);
imshow("dst", dst);
waitKey();
}
return 0;
}