数字图像处理实验报告姓名:学号:班级:指导老师:王欢实验一1.实验目的对一幅图像的直方图进行均衡化,即产生一幅灰度级分布具有均匀概率密度的图像,扩展像素取值的动态范围,达到了图象增强的目的2.实验原理(1).直方图的理论基础:a.直方图概念:灰度直方图表示图像中每种灰度出现的频率。b.直方图的作用:反映一幅图像的灰度分布特性c.直方图的计算:(2).直方图的优点直方图具有很多的优点,直方图能反映图像的概貌,比如图像中有几类目标,目标和背景的分布如何;通过直方图可以直接计算图像中的最大亮度、最小亮度、平均亮度、对比度以及中间亮度等。使用直方图可以完成图像分割、目标检索等。因为不同的目标具有不同的颜色分布。使用归一化直方图作目标匹配,还不易受到目标翻转和目标大小变化的影响。在图像查询的系统中,直方图有很大的应用,用它存储目标的特征占有空间小,且执行速度快。(3).均衡化原理kiiknnrP0)(根据熵理论可知当H[0],H[1]…,H[n-1]相等时,图像信息量Hi都相等,即把原始图的直方图变换为均匀分布的形式,这样就增加了象素值的范围,增强了图像的对比效果。令A0是图像面积,N是有效亮度级的个数,对于一个完全平坦的直方图来说,应该在每一个亮度级上A0/N个象素。设g是原来的灰度级,G是变换后的灰度级,则可描述为:G=F(g)。实际应用中,有两种情况需要考虑:(1)多个至一个:若有连续n个灰级的频数之和级等于A/N,则必导致它们合并成一个灰度级。(2)一个到多个:若有某个灰级的频数是A0/N的R倍,则必须将其分为R个不同的灰阶级,每一个上都是A0/N。情况(1)导致的灰度级的合并是简单的(是多到一的映射关系),但情况(2)时的分解是不容易的(是一到多的关系),因为确实难以判定g在图像的不同位置,到底如何分解才是最好。假设灰度级g要映射到[GL,GR]中,有3种规则可以遵循:(1)规则1:总是将g映射为(GL+GR)/2。(2)规则2:随机分配出[GL,GR]中的一个灰度级。(3)规则3:检查该象素的近邻象素的灰度平均值u,并分配给它一个[GL,GR]中最接u的灰度级Gk。在图像均衡化后,H2要求是每个灰度级上都有A0/N个象素,显然有:NAGiHiHGigi00201)()(从而得到G=F(g)为:其中,A(g)是像素分布函数(累积函数)step.1计算累积函数A(g)如下:for(g=0;g256;g++)A[g]=0;//初始化累积函数if(Hist[0])N=1;elseN=0;for(g=1,A[0]=Hist[0];g256;g++){A[g]=A[g-1]+Hist[g];//递推求累积函数if(Hist[g])N++;//统计有效的灰度级的个数}step.2计算映射关系G=F(g)for(g=0;g256;g++)LUT[g]=N*A[g]/A[255];//A0=A[255]step.3均衡化操作for(i=0,pCur=pImg;iimgsize;i++)*(pCur++)=LUT(*pCur);在整个计算过程中,我们使用的不是归一化直方图和归一化灰度,这样在上面的算法完成后,得到的最大灰度为N,而不是255。因此在Step.2中,需要构造线性拉伸。乘上比例系数255/N.step.2计算映射关系G=F(g)for(g=0;g256;g++)LUT[g]=(255.0/N)*N*A[g]/A[255];)()(0010gAANiHANGgi即:step.2计算映射关系G=F(g)for(g=0;g256;g++)LUT[g]=255*A[g]/A[255];3.实验过程voidmain(){intwidth,height;BYTE*pGryImg=RmwRead8BitBmpFile2Img(1.bmp,&width,&height);//读入图片printf(%d,%d,width,height);RmwHistogramEqualize(pGryImg,width,height);RmwWrite8BitImg2BmpFile(pGryImg,width,height,1.bmp);//重写图片deletepGryImg;//释放指针return;}其中直方图均衡化的函数实现如下voidRmwHistogramEqualize(BYTE*pImg,intwidth,intheight){BYTE*pCur,*pEnd=pImg+width*height;unsignedinthist[256];intLUT[256],i,sum;memset(hist,0,sizeof(int)*256);for(pCur=pImg;pCurpEnd;){hist[*(pCur++)]++;for(sum=hist[0],LUT[0]=0,i=1;i256;i++){printf(%d:%d\n,i,hist[i]);sum=sum+hist[i];LUT[i]=255*sum/(width*height);//n被约掉了}for(pCur=pImg;pCurpEnd;)*(pCur++)=LUT[*pCur];return;}4.实验结果(均衡化前后对比)实验二1.实验目的实现otsu算法,即使用otsu算法来进行图像分割,使得图像的背景与目标尽可能区分最大2.实验原理OTSU算法(大律法或最大类间方差法)一、Otsu最大类间方差法原理利用阈值将原图像分成前景,背景两个图象。前景:用n1,csum,m1来表示在当前阈值下的前景的点数,质量矩,平均灰度后景:用n2,sum-csum,m2来表示在当前阈值下的背景的点数,质量矩,平均灰度当取最佳阈值时,背景应该与前景差别最大,关键在于如何选择衡量差别的标准,而在otsu算法中这个衡量差别的标准就是最大类间方差(英文简称otsu,这也就是这个算法名字的来源),在本程序中类间方差用sb表示,最大类间方差用fmax关于最大类间方差法(otsu)的性能:类间方差法对噪音和目标大小十分敏感,它仅对类间方差为单峰的图像产生较好的分割效果。当目标与背景的大小比例悬殊时,类间方差准则函数可能呈现双峰或多峰,此时效果不好,但是类间方差法是用时最少的。最大类间方差法(otsu)的公式推导:记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。则图像的总平均灰度为:u=w0*u0+w1*u1。前景和背景图象的方差:g=w0*(u0-u)*(u0-u)+w1*(u1-u)*(u1-u)=w0*w1*(u0-u1)*(u0-u1),此公式为方差公式。3.实验过程读入和写入函数同实验一;OTSU函数:voidOTSU(BYTE*pOrgImg,intwidth,intheight,BYTE*pBinImg){inthistogram[256];BYTE*pCur,*pEnd,*pRes;inti,t,dist,maxDist,bst_t,imgSize;doublew1,w2,u1,u2;//1.建立直方图imgSize=width*height;for(i=0;i256;i++)histogram[i]=0;for(pCur=pOrgImg,pEnd=pOrgImg+imgSize;pCurpEnd;pCur++)histogram[*pCur++]++;//2.搜索OTST阈值for(maxDist=t=0;t256;t++){//统计左边for(w1=0,u1=0,i=0;i=t;i++){u1+=i*histogram[i];w1+=histogram[i];}//统计右边for(w2=0,u2=0,i=t;i255;i++){u2+=i*histogram[i];w2+=histogram[i];}dist=(u1-u2)*(u1-u2)*w1*w2;if(distmaxDist){maxDist=dist;bst_t=t;}}//3.图像分割(二值化)for(pCur=pOrgImg,pRes=pBinImg,pEnd=pOrgImg+imgSize;pCurpEnd;pCur++,pRes++){*pRes=(*pCurbst_t)?255:0;}return;}4.实验结果(OTSU算法处理前后对比)实验三1.实验目的利用索伯算子(Sobel)进行边缘检测,得到图像的与实际比较接近的边缘.2.实验原理索伯算子(Sobel)定义:写成模板形式即:)7021()5423()7625()1123(),(PPPPPPPPPPPPyxS121000-1-2-110-120-210-1特点:(1)先求和后相减。(2)求和过程是加权的均值滤波,只不过没有除4。(3)相减的过程是求差分,即求导。(4)等于原图像先做均值滤波,再求x、y方向偏导数之和。3.实验过程读入和写入函数同实验一;算法实现函数SobelGrayImage():voidSobelGrayImage(BYTE*pGryImg,intwidth,intheight,BYTE*pSbImg){inti,j,G1,G2,x2,y2;BYTE*pGry,*pSb,*pCurGry,*pCurSb;x2=width-1;y2=height-1;RmwSetImageBoundary(pSbImg,width,height,0);for(i=1,pGry=pGryImg+width,pSb=pSbImg+width;iy2;i++,pGry+=width,pSb+=width){for(j=1,pCurGry=pGry+j,pCurSb=pSb+j;jx2;j++,pCurGry++){G1=*(pCurGry-width-1)+(*(pCurGry-width)*2)+*(pCurGry-width+1);G1-=*(pCurGry+width-1)+(*(pCurGry+width)*2)+*(pCurGry+width+1);G2=*(pCurGry-1-width)+(*(pCurGry-1)*2)+*(pCurGry-1+width);G2-=*(pCurGry+1-width)+(*(pCurGry+1)*2)+*(pCurGry+1+width);*(pCurSb++)=min(255,abs(G1)+abs(G2));//*(pCurSb++)=abs(G1)+abs(G2);}}return;}4.实验结果(Sobel算法处理前后对比)实验四1.实验目的掌握Hough变换的思想。掌握直线Hough变换的编程。2.实验原理霍夫变换(HoughTransform)定义:从区域的边界(空间域)到参数空间的变换,用大多数边界点(众数)满足的对应的参数来描述区域的边界。方法一:for(k=k1;kk2;k+=stepk){for(b=b1;bb2;b+=stepb){for(i=0;in;i++){if(yi==k*xi+b)count[k][b]++;//应该fabs(yi-k*xi+b)delta??}}}因此,寻找count中的最大值,则该最大值对应的(k,b)即为最佳直线的参数。缺点:数值计算困难,因为难以选择斜率的范围[K1,K2],直线的斜率取值范围太大[是无穷大],步长stepk也难以控制。方法二:直线Hough变换的(ρ,θ)空间方法:for(ρ=ρ1;ρ=ρ2;ρ+=stepρ){for(θ=θ1;θ=θ2;θ+=stepθ){for(i=0;in;i++){if(ρ==xi*cos(θ)+yi*sin(θ))count[ρ][θ]++;}}}优点:穷举(ρ,θ)远比(k,b)直观,其范围[ρ1,ρ2]和[θ1,θ2]也容易确定。改进:for(θ=θ1;θ=θ2;θ+=stepθ){for(i=0;in;i++){ρ=xi*cos(θ)+yi*