05-12 11:13
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[OpenCV] 2D Convolution / New Filter 본문

Programming/OpenCV

[OpenCV] 2D Convolution / New Filter

cinema4dr12 2015. 9. 16. 00:09

Concept

OpenCV의 filter2D는 Linear Filter를 생성하는 함수.

Prototype

Prototype은 다음과 같습니다:


void cv::filter2D (
    InputArray  src,
    OutputArray     dst,
    int     ddepth,
    InputArray  kernel,
    Point   anchor = Point(-1,-1),
    double  delta = 0,
    int     borderType = BORDER_DEFAULT
)


이 함수는 주어진 kernel을 이용하여 convolution을 하는데 이용됩니다. 사실 이 함수는 convolution을 하는 것이 아니라 correlation을 계산하는 것입니다:


\( \mathrm{dst}(x,y) = \displaystyle{ \sum_{ 0 \le x' \le \mathrm{kernal.cols}, 0 \le y' \mathrm{kernel.rows} }{ \mathrm{kernel}(x',y') * \mathrm{src}(s + x' - \mathrm{anchor}.x - y' - \mathrm{anchor}.y ) } } \)


Parameters의 설명은 다음 표와 같습니다:


 src

 입력 이미지

 dst

 src와 동일한 크기 및 동일한 채널의 출력 이미지

 ddepth

 원하는 목표이미지의 깊이

 kernel

 convolution kernel (또는 correlation kernel); 단일 채널 부동소수점 행렬

 anchor

 kernel 내 필터된 포인트의 상대 위치를 나타내는 kernel의 앵커; 디폴트 값인 (-1,-1)은 앵커가 kernel의 중앙에 있음을 의미함

 delta

 필터링 된 픽셀을 dst에 저장하기 전에 옵션값들을 이들 픽셀에 추가

 borderType

 픽셀 외삽

Steps

1. 이미지를 불러옵니다.

2. 입력 행렬과 convolve할 kernel을 생성합니다.

3. Convolution을 적용합니다.

4. Contour를 그립니다.

Example Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "opencv2/video/tracking.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/video/tracking.hpp"
#include <Windows.h>
#include "opencv2/imgproc/imgproc.hpp"
#include <stdlib.h>
#include <stdio.h>
 
using namespace std;
using namespace cv;
 
/*/////////////////////////////////////
@ function: conv2
*//////////////////////////////////////
void conv2( cv::Mat src, int kernel_size )
{
    cv::Mat dst,kernel;
    kernel = cv::Mat::ones( kernel_size, kernel_size, CV_32F ) / (float)( kernel_size * kernel_size );
  
    /// Apply filter
    cv::filter2D( src, dst, -1 , kernel, Point( -1-1 ), 0, BORDER_DEFAULT );
    cv::namedWindow( "filter2D Demo", CV_WINDOW_AUTOSIZE );
    cv::imshow( "filter2D Demo", dst );
}
 
 
/*/////////////////////////////////////
@ function: main
*//////////////////////////////////////
int main()
{
    cv::Mat src;
  
    /// Load an image
    src = cv::imread( {YOUR_IMAGE_PATH}, 1 );
 
    if!src.data )  { return -1; }
  
    conv2( src, 3 );
  
    cv::waitKey( 0 );
 
    return 0;
}
cs

Results

Original


Filtered

Comments