到今天已经学了将近一周的数字图像了,感觉路途非常遥远,要学的东西太多了,一直感觉自己挺笨的,没关系我还是很有热情。
因为以前从来没学过数字图像处理,我的帖子大部分都是很基础的东西,和那些小牛比起来真是自惭形秽啊。。。但我们想总有和我一样刚接触这个领域的同学,也许我写的东西对他们没有任何用处,可也许有用呢说了一些废话开始吧。
全局阈值分割图像应该是图像分割里最简单的了,思想是来以直方图的波谷为阈值对图像进行对象和背景的分割,很简单的算法就不详细展开了
#include "dipHeader.h"
void threshold(IplImage* isrc, IplImage* idst)
{
IplImage* g1 = cvCreateImage(cvGetSize(isrc),8,1);//大于T
IplImage* g2 = cvCreateImage(cvGetSize(isrc),8,1);
double T,Temp, min,max;
CvScalar mean1 ;
CvScalar mean2 ;
cvMinMaxLoc(isrc,&min,&max);
T=0.5*(max+min);
bool run = true;
while(run)
{
//cvThreshold(src,g,(double)T,255,CV_THRESH_BINARY);
cvZero(g1);
cvZero(g2);
for (int x=0; x<isrc->height;x++)
{
for (int y=0;y<isrc->width;y++)
{
if (isrc->imageData[x*isrc->widthStep+y]>T)
{
g1->imageData[x*g1->widthStep+y] = isrc->imageData[x*isrc->widthStep+y];
}
else
{
g2->imageData[x*g2->widthStep+y] = isrc->imageData[x*isrc->widthStep+y];
}
}
}
mean1=cvAvg(g1);
mean2=cvAvg(g2);
Temp = 0.5*(mean1.val[0]+mean2.val[0]);
run = fabs(T-Temp)>0.5;
T=Temp;
}
cvThreshold(isrc,idst,T,255,CV_THRESH_BINARY_INV);
}
void main()
{
IplImage* src = cvLoadImage("quanju.tif");
IplImage* g = cvCreateImage(cvGetSize(src),8,src->nChannels);
cvNamedWindow("src",1);
cvShowImage("src",src);
//cvWaitKey(0);
IplImage* temp1d = cvCreateImage(cvGetSize(src),8,1);
IplImage* temp2d = cvCreateImage(cvGetSize(src),8,1);
IplImage* temp3d = cvCreateImage(cvGetSize(src),8,1);
IplImage* temp1 = cvCreateImage(cvGetSize(src),8,1);
IplImage* temp2 = cvCreateImage(cvGetSize(src),8,1);
IplImage* temp3 = cvCreateImage(cvGetSize(src),8,1);
cvSplit(src,temp1,temp2,temp3,0);
threshold(temp1,temp1d);
threshold(temp2,temp2d);
threshold(temp3,temp3d);
cvMerge(temp1d,temp2d,temp3d,0,g);
cvNamedWindow("g",1);
cvShowImage("g",g);
cvWaitKey(0);
}