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
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
// lab_1.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include
#include
#include
#include
using
namespace
std;
//声明图像IplImage指针
IplImage* pSrcImg=NULL;
IplImage* pGrayImg=NULL;
IplImage* pBinaryImg=NULL;
int
Thresh=127;
//初始化滑动条位置
//滑动条响应函数
void
onTrackerSlid(
int
thresh)
{
//将图像转化为二值图
pBinaryImg=cvCreateImage(cvGetSize(pSrcImg),pSrcImg->depth,pSrcImg->nChannels);
cvCopy(pSrcImg,pBinaryImg);
//复制图像数据
CvScalar scalar;
int
avg;
for
(
int
i=0;i
{
for
(
int
j=0;j
{
scalar=cvGet2D(pBinaryImg,i,j);
//获取点(i,j)的像素
avg=(scalar.val[0]+scalar.val[1]+scalar.val[2])/3;
if
(avg
{
scalar.val[0]=scalar.val[1]=scalar.val[2]=0;
cvSet2D(pBinaryImg,i,j,scalar);
}
else
{
scalar.val[0]=scalar.val[1]=scalar.val[2]=255;
cvSet2D(pBinaryImg,i,j,scalar);
}
}
}
//显示图像
cvShowImage(
"二值化图像"
,pBinaryImg);
}
int
main(
int
argc,
char
** argv)
{
if
(argc!=2)
argv[1]=
"lena.jpg"
;
//载入图像
if
((pSrcImg=cvLoadImage(argv[1],1))!=0)
{
cout<<
"按Esc键退出..."
<
//将颜色空间由RGB转化为Gray
pGrayImg=cvCreateImage(cvGetSize(pSrcImg),8,1);
cvCvtColor(pSrcImg,pGrayImg,CV_RGB2GRAY);
//创建图像窗口
cvNamedWindow(
"原图像"
,CV_WINDOW_AUTOSIZE);
cvNamedWindow(
"灰度图像"
,CV_WINDOW_AUTOSIZE);
cvNamedWindow(
"二值化图像"
,CV_WINDOW_AUTOSIZE);
//添加滑动条来调节阈值
cvCreateTrackbar(
"阈值"
,
"二值化图像"
,&Thresh,255,onTrackerSlid);
onTrackerSlid(Thresh);
//显示图像
cvShowImage(
"原图像"
,pSrcImg);
cvShowImage(
"灰度图像"
,pGrayImg);
//保存图像
cvSaveImage(
"Gray_Image.jpg"
,pGrayImg);
cvSaveImage(
"Binary_Image.jpg"
,pBinaryImg);
//等待按"Esc"键退出
while
(
true
)
if
(cvWaitKey(100)==27)
break
;
//销毁窗口
cvDestroyWindow(
"原图像"
);
cvDestroyWindow(
"灰度图像"
);
cvDestroyWindow(
"二值化图像"
);
//释放图像
cvReleaseImage(&pSrcImg);
cvReleaseImage(&pGrayImg);
cvReleaseImage(&pBinaryImg);
return
0;
}
return
-1;
}
|