1
/*
===============================图像分割=====================================
*/
2
/*
---------------------------------------------------------------------------
*/
3
/*
手动设置阀值
*/
4
IplImage
*
binaryImg
=
cvCreateImage(cvSize(w, h),IPL_DEPTH_8U,
1
);
5
cvThreshold(smoothImgGauss,binaryImg,
71
,
255
,CV_THRESH_BINARY);
6
cvNamedWindow(
"
cvThreshold
"
, CV_WINDOW_AUTOSIZE );
7
cvShowImage(
"
cvThreshold
"
, binaryImg );
8
//
cvReleaseImage(&binaryImg);
9
/*
---------------------------------------------------------------------------
*/
10
/*
自适应阀值 //计算像域邻域的平均灰度,来决定二值化的值
*/
11
IplImage
*
adThresImg
=
cvCreateImage(cvSize(w, h),IPL_DEPTH_8U,
1
);
12
double
max_value
=
255
;
13
int
adpative_method
=
CV_ADAPTIVE_THRESH_GAUSSIAN_C;
//
CV_ADAPTIVE_THRESH_MEAN_C
14
int
threshold_type
=
CV_THRESH_BINARY;
15
int
block_size
=
3
;
//
阈值的象素邻域大小
16
int
offset
=
5
;
//
窗口尺寸
17
cvAdaptiveThreshold(smoothImgGauss,adThresImg,max_value,adpative_method,threshold_type,block_size,offset);
18
cvNamedWindow(
"
cvAdaptiveThreshold
"
, CV_WINDOW_AUTOSIZE );
19
cvShowImage(
"
cvAdaptiveThreshold
"
, adThresImg );
20
cvReleaseImage(
&
adThresImg);
21
/*
---------------------------------------------------------------------------
*/
22
/*
最大熵阀值分割法
*/
23
IplImage
*
imgMaxEntropy
=
cvCreateImage(cvGetSize(imgGrey),IPL_DEPTH_8U,
1
);
24
MaxEntropy(smoothImgGauss,imgMaxEntropy);
25
cvNamedWindow(
"
MaxEntroyThreshold
"
, CV_WINDOW_AUTOSIZE );
26
cvShowImage(
"
MaxEntroyThreshold
"
, imgMaxEntropy );
//
显示图像
27
cvReleaseImage(
&
imgMaxEntropy );
28
/*
---------------------------------------------------------------------------
*/
29
/*
基本全局阀值法
*/
30
IplImage
*
imgBasicGlobalThreshold
=
cvCreateImage(cvGetSize(imgGrey),IPL_DEPTH_8U,
1
);
31
cvCopyImage(srcImgGrey,imgBasicGlobalThreshold);
32
int
pg[
256
],i,thre;
33
for
(i
=
0
;i
<
256
;i
++
) pg[i]
=
0
;
34
for
(i
=
0
;i
<
imgBasicGlobalThreshold
->
imageSize;i
++
)
//
直方图统计
35
pg[(BYTE)imgBasicGlobalThreshold
->
imageData[i]]
++
;
36
thre
=
BasicGlobalThreshold(pg,
0
,
256
);
//
确定阈值
37
cout
<<
"
The Threshold of this Image in BasicGlobalThreshold is:
"
<<
thre
<<
endl;
//
输出显示阀值
38
cvThreshold(imgBasicGlobalThreshold,imgBasicGlobalThreshold,thre,
255
,CV_THRESH_BINARY);
//
二值化
39
cvNamedWindow(
"
BasicGlobalThreshold
"
, CV_WINDOW_AUTOSIZE );
40
cvShowImage(
"
BasicGlobalThreshold
"
, imgBasicGlobalThreshold);
//
显示图像
41
cvReleaseImage(
&
imgBasicGlobalThreshold);
42
/*
---------------------------------------------------------------------------
*/
43
/*
OTSU
*/
44
IplImage
*
imgOtsu
=
cvCreateImage(cvGetSize(imgGrey),IPL_DEPTH_8U,
1
);
45
cvCopyImage(srcImgGrey,imgOtsu);
46
int
thre2;
47
thre2
=
otsu2(imgOtsu);
48
cout
<<
"
The Threshold of this Image in Otsu is:
"
<<
thre2
<<
endl;
//
输出显示阀值
49
cvThreshold(imgOtsu,imgOtsu,thre2,
255
,CV_THRESH_BINARY);
//
二值化
50
cvNamedWindow(
"
imgOtsu
"
, CV_WINDOW_AUTOSIZE );
51
cvShowImage(
"
imgOtsu
"
, imgOtsu);
//
显示图像
52
cvReleaseImage(
&
imgOtsu);
53
/*
---------------------------------------------------------------------------
*/
54
/*
上下阀值法:利用正态分布求可信区间
*/
55
IplImage
*
imgTopDown
=
cvCreateImage( cvGetSize(imgGrey), IPL_DEPTH_8U,
1
);
56
cvCopyImage(srcImgGrey,imgTopDown);
57
CvScalar mean ,std_dev;
//
平均值、 标准差
58
double
u_threshold,d_threshold;
59
cvAvgSdv(imgTopDown,
&
mean,
&
std_dev,NULL);
60
u_threshold
=
mean.val[
0
]
+
2.5
*
std_dev.val[
0
];
//
上阀值
61
d_threshold
=
mean.val[
0
]
-
2.5
*
std_dev.val[
0
];
//
下阀值
62
//
u_threshold = mean + 2.5 * std_dev;
//
错误
63
//
d_threshold = mean - 2.5 * std_dev;
64
cout
<<
"
The TopThreshold of this Image in TopDown is:
"
<<
d_threshold
<<
endl;
//
输出显示阀值
65
cout
<<
"
The DownThreshold of this Image in TopDown is:
"
<<
u_threshold
<<
endl;
66
cvThreshold(imgTopDown,imgTopDown,d_threshold,u_threshold,CV_THRESH_BINARY_INV);
//
上下阀值
67
cvNamedWindow(
"
imgTopDown
"
, CV_WINDOW_AUTOSIZE );
68
cvShowImage(
"
imgTopDown
"
, imgTopDown);
//
显示图像
69
cvReleaseImage(
&
imgTopDown);
70
/*
---------------------------------------------------------------------------
*/
71
/*
迭代法
*/
72
IplImage
*
imgIteration
=
cvCreateImage( cvGetSize(imgGrey), IPL_DEPTH_8U,
1
);
73
cvCopyImage(srcImgGrey,imgIteration);
74
int
thre3,nDiffRec;
75
thre3
=
DetectThreshold(imgIteration,
100
, nDiffRec);
76
cout
<<
"
The Threshold of this Image in imgIteration is:
"
<<
thre3
<<
endl;
//
输出显示阀值
77
cvThreshold(imgIteration,imgIteration,thre3,
255
,CV_THRESH_BINARY_INV);
//
上下阀值
78
cvNamedWindow(
"
imgIteration
"
, CV_WINDOW_AUTOSIZE );
79
cvShowImage(
"
imgIteration
"
, imgIteration);
80
cvReleaseImage(
&
imgIteration);