- 다음 예제에서 사용한 선명한 필터에서 커널은 다음과 같다.
0 -1 0
-1 5 -1
0 -1 0
- 따로 명시되지 않으면 현재 화소는 커널의 중심에 대응.
- 커널 내 각 셀에 있는 값은 일치하는 화소와 곱하는 인자를 의미.
- 화소에 대한 커널을 적용한 결과는 모든 곱셈의 합. 커널의 크기는 이웃 크기에 대응.
- 선명화 필터에서 볼 수 있듯 현재 화소의 네 가지 수평과 수직 이웃은 -1로 곱하는데, 가운데는 5를 곱한다.
- 필터링은 영상처리에서 일반적인 작업이므로, OpenCV는 cv::filter2D함수로 해당 작업을 수행한다. - 선명화 함수 (사용하기 위해서는 커널 - 행렬 형태로 정의해야 함)
- Example
#include <iostream>#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp> // filter2D를 사용하기 위해 include
void sharpen2D(const cv::Mat &image, cv::Mat &result){
cv::Mat kernel(3, 3, CV_32F, cv::Scalar(0));
// 커널 생성(모든 값을 0으로 초기화)
kernel.at<float>(1, 1) = 5.0; // 커널 값에 할당
kernel.at<float>(0, 1) = -1.0;
kernel.at<float>(2, 1) = -1.0;
kernel.at<float>(1, 0) = -1.0;
kernel.at<float>(1, 2) = -1.0;
cv::filter2D(image, result, image.depth(), kernel);
// 영상 필터링
}
int main()
{
cv::Mat image = cv::imread("img2.jpg", 0);
cv::Mat result;
sharpen2D(image, result);
cv::namedWindow("Image");
cv::imshow("Image", image);
cv::namedWindow("Result");
cv::imshow("Result", result);
cv::waitKey(5000);
return 0;
}
- Result
- 참고문헌 : OpenCV 2 Computer Vision Application Programming Cookbook