圖像形態(tài)學(xué)膨脹的結(jié)構(gòu)分解opencv實(shí)驗(yàn)
寬度W,高度H 的圖像,做膨脹操作,如果膨脹的結(jié)構(gòu)元素structure element,大小為kw,kh,那么就需要做W*H*kw*kh次運(yùn)算,運(yùn)算量比較大。
根據(jù)圖像形態(tài)學(xué)的理論,膨脹滿足結(jié)合律,即
,B和C為結(jié)構(gòu)元素。假設(shè)一個(gè)結(jié)構(gòu)元素S可以表示為兩個(gè)結(jié)構(gòu)元素B和C的膨脹,即S=B⊕C,則A⊕S=A⊕(B⊕C)=(A⊕B)⊕C,換言之,用S膨脹A等同于用B先膨脹A,再用C膨脹前面的結(jié)果。我們稱S能夠分解成B和C兩個(gè)結(jié)構(gòu)元素。結(jié)合律很重要,因?yàn)橛?jì)算膨脹所需要的時(shí)間正比于結(jié)構(gòu)元素中的非零像素的個(gè)數(shù)。通過上述推導(dǎo),分解結(jié)構(gòu)元素,然后再分別用子結(jié)構(gòu)元素進(jìn)行膨脹操作往往會(huì)實(shí)現(xiàn)很客觀的速度的增長。
同樣,腐蝕也可以做結(jié)構(gòu)分解,腐蝕滿足公式
,B和C為結(jié)構(gòu)元素,同樣如果一個(gè)結(jié)構(gòu)元素S可以表示為兩個(gè)結(jié)構(gòu)元素B和C的膨脹,即S=B⊕C,那么用S腐蝕A等同于用B先腐蝕A,再用C腐蝕前面的結(jié)果。公式推導(dǎo)省略。
圖像形態(tài)學(xué)膨脹和腐蝕介紹,可見
http://en.wikipedia.org/wiki/Erosion_(morphology)
http://en.wikipedia.org/wiki/Dilation_(morphology)
做結(jié)構(gòu)分解后的運(yùn)算量為W*H*(kw+kh)
代碼如下
#include <cv.h>2
#include <highgui.h>3
#include <stdio.h>4

5

6
int main(int argc, char** argv)7
{8
if(argc<2) {9
printf("has no param\n");10
return 0;11
}12

13
IplConvKernel *element1 = cvCreateStructuringElementEx( 1, 25, 0, 0, CV_SHAPE_RECT, 0);14
IplConvKernel *element2 = cvCreateStructuringElementEx( 16, 1, 0, 0, CV_SHAPE_RECT, 0);15
IplConvKernel *element3 = cvCreateStructuringElementEx( 16, 25, 0, 0, CV_SHAPE_RECT, 0);16
17
IplImage* src=cvLoadImage(argv[1],1); 18
19

20
if( src!= NULL)21
{22
23
IplImage* img = cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);24
cvCvtColor(src,img,CV_BGR2GRAY);25
cvReleaseImage(&src);26
27
28
IplImage* tmp = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);29
cvDilate( img, tmp, element1, 1);30
31
IplImage* dst1 = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 32
cvDilate( tmp, dst1, element2, 1);33
34
35
IplImage* dst2 = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 36
cvDilate( img, dst2, element3, 1);37
38
IplImage* diff = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1); 39
cvSub(dst2,dst1,tmp,NULL);40
cvEqualizeHist( tmp, diff);41
cvReleaseImage(&tmp);42
43
int noZeroCount=cvCountNonZero(diff);44
printf("no zerocount %d\n",noZeroCount);45
46
47
cvNamedWindow("img",CV_WINDOW_AUTOSIZE);48
cvShowImage("img",img);49
cvNamedWindow("dst1",CV_WINDOW_AUTOSIZE);50
cvShowImage("dst1",dst1);51
cvNamedWindow("dst2",CV_WINDOW_AUTOSIZE);52
cvShowImage("dst2",dst2);53
cvNamedWindow("diff",CV_WINDOW_AUTOSIZE);54
cvShowImage("diff",diff);55
56
57
cvWaitKey();58
cvDestroyAllWindows();59
60
61
cvReleaseImage(&img);62
cvReleaseImage(&dst1);63
cvReleaseImage(&dst2);64
cvReleaseImage(&diff);65
66
cvReleaseStructuringElement(&element1);67
cvReleaseStructuringElement(&element2);68
cvReleaseStructuringElement(&element3);69
70
71
72
73
74
}75
else76
{77
printf("error,not load\n");78
}79
return 0;80
};81

posted on 2013-02-21 10:39 mcs51a 閱讀(2319) 評(píng)論(0) 編輯 收藏 引用



