您的位置:首页 > 其它

《数字图像处理》学习笔记(八)--全局阈值分割

2014-01-13 20:31 381 查看
   到今天已经学了将近一周的数字图像了,感觉路途非常遥远,要学的东西太多了,一直感觉自己挺笨的,没关系我还是很有热情。


   因为以前从来没学过数字图像处理,我的帖子大部分都是很基础的东西,和那些小牛比起来真是自惭形秽啊。。。但我们想总有和我一样刚接触这个领域的同学,也许我写的东西对他们没有任何用处,可也许有用呢

说了一些废话开始吧。

  全局阈值分割图像应该是图像分割里最简单的了,思想是来以直方图的波谷为阈值对图像进行对象和背景的分割,很简单的算法就不详细展开了



#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);
}




 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息