IT/- 프로그래밍

OpenCV 사용자가 지정한 마스크로 컨벌루션하기

혁준7519 2017. 4. 17. 06:57

사용자가 지정한 마스크로 컨벌루션하기

컨벌루션 : 가중치를 갖는 마스크를 이용해 영상처리를 하는것



c++)

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
#include <opencv/cv.h>
#include <opencv/highgui.h>
 
 
void main() {
    IplImage *srcImage = cvLoadImage("D:/study/testimage.jpg"-1);
    IplImage *resultImage = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 3);
 
    double maskData[7][7= { { 1.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 49 },
                              { 1.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 49 },
                              { 1.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 49 },
                              { 1.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 49 },
                              { 1.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 49 },
                              { 1.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 49 },
                              { 1.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 491.0 / 49 }};
    //cvMat(행의수, 열의수, 행렬원소의 형태, 데이터) : 행렬생성
    //행렬원소의 형태 : CV_<비트수>(S|U|F)C<채널수>
    CvMat kernel = cvMat(77, CV_64FC1, maskData);
    
    //cvFilter2D(원본 이미지, 결과 이미지, 마스크 행렬) : 사용자 정의한 마스크로 이미지 블러링
    //ps. 마스크 행렬 데이터들은 1채널 실수형이어야 한다
    cvFilter2D(srcImage, resultImage, &kernel);
 
 
    //create window
    cvNamedWindow("source image", CV_WINDOW_AUTOSIZE);
    cvNamedWindow("7x7 image", CV_WINDOW_AUTOSIZE);
 
    //show window
    cvShowImage("source image", srcImage);
    cvShowImage("7x7 image", resultImage);
 
    cvWaitKey(0);
 
    cvReleaseImage(&srcImage);
    cvReleaseImage(&resultImage);
}
 
cs



결과