2012년 12월 28일 금요일

OpenCV #2-5 Example (이웃 접근으로 영상 조회 - 부연 설명)

 - 이웃 화소에 대한 계산이 끝나면 대부분 커널 행렬을 표시.
 - 다음 예제에서 사용한 선명한 필터에서 커널은 다음과 같다.
 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