圖像形態學膨脹的結構分解opencv實驗
寬度W,高度H 的圖像,做膨脹操作,如果膨脹的結構元素structure element,大小為kw,kh,那么就需要做W*H*kw*kh次運算,運算量比較大。
根據圖像形態學的理論,膨脹滿足結合律,即,B和C為結構元素。假設一個結構元素S可以表示為兩個結構元素B和C的膨脹,即S=B⊕C,則A⊕S=A⊕(B⊕C)=(A⊕B)⊕C,換言之,用S膨脹A等同于用B先膨脹A,再用C膨脹前面的結果。我們稱S能夠分解成B和C兩個結構元素。結合律很重要,因為計算膨脹所需要的時間正比于結構元素中的非零像素的個數。通過上述推導,分解結構元素,然后再分別用子結構元素進行膨脹操作往往會實現很客觀的速度的增長。
同樣,腐蝕也可以做結構分解,腐蝕滿足公式 ,B和C為結構元素,同樣如果一個結構元素S可以表示為兩個結構元素B和C的膨脹,即S=B⊕C,那么用S腐蝕A等同于用B先腐蝕A,再用C腐蝕前面的結果。公式推導省略。
圖像形態學膨脹和腐蝕介紹,可見
http://en.wikipedia.org/wiki/Erosion_(morphology)
http://en.wikipedia.org/wiki/Dilation_(morphology)
做結構分解后的運算量為W*H*(kw+kh)
代碼如下
1
#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
else
76
{
77
printf("error,not load\n");
78
}
79
return 0;
80
};
81

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

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81
