当前位置:文档之家› 图像灰度化

图像灰度化

图像灰度化图像灰度化原理:关于YUV空间的彩色图像,其Y的分量的物理意义本身就是像素点的亮度,由该值反映亮度等级,因此可根据RGB和YUV颜色空间的变化关系建立亮度Y与R、G、B三个颜色分量的对应:Y=0.299R+0.587G+0.114B,以这个亮度值表达图像的灰度值图像处理结果:程序代码:char *pmydata; //定义一个指针用来指向位图图像数据在内存中的存储区域//long wide, high;BITMAP bm;pbmp->GetBitmap(&bm);pmydata=new char[bm.bmWidthBytes*bm.bmHeight]; //根据位图的高度宽度初始化一下pbmp->GetBitmapBits(bm.bmWidthBytes*bm.bmHeight,pmydata); //将位图对象的数据COPY到pmydata指向的区域,m_bm是位图对象,bm是位图结构,可参考上一篇文章的定义for(int i=0;i<bm.bmWidthBytes*bm.bmHeight;i+=4) //因为一个像素有4个字节,故i+=4{ char Y=0;Y=(pmydata[i]*0.299+pmydata[i+1]*0.5876+pmydata[i+2]*0.114);pmydata[i]=Y;//Rpmydata[i+1]=Y;//Gpmydata[i+2]=Y;//B}pbmp->SetBitmapBits(bm.bmWidthBytes*bm.bmHeight,pmydata); //将处理后的数据COPY进位图对象DrawBmp();图像均值化图像均值化原理:图通常是最能说明问题的东西,非常明显的,这个3*3区域像素的颜色值分别是5,3,6,2,1,9,8,4,7那么中间的1这个像素的过滤后的值就是这些值的平均值,也就是前面的计算方法:(5+3+6+2+1+9+8+4+7)/9=5,图像处理结果:程序代码:void CMyDIPView::OnMenuitem32778(){// TODO: Add your command handler code here CMyDIPDoc* pDoc = GetDocument();//设定模板参数double tem[9]={1,1,1,1,1,1,1,1,1};//设定模板系数double xishu = 1.0/9.0;//进行模板操作pDoc->m_hDIB =Template(pDoc->m_hDIB,tem ,3,3, xishu);//调用Template函数,对图像进行模板操作)Invalidate(TRUE);}HDIB Template(HDIB hDIB,double * tem ,int tem_w,int tem_h,double xishu) {//统计中间值double sum;//指向图像起始位置的指针BYTE *lpDIB=(BYTE*)::GlobalLock((HGLOBAL) hDIB);//指向象素起始位置的指针BYTE *pScrBuff =(BYTE*)::FindDIBBits((char*)lpDIB);//获取图像的颜色信息int numColors=(int) ::DIBNumColors((char *)lpDIB);//如果图像不是256色返回if (numColors!=256){//解除锁定::GlobalUnlock((HGLOBAL) hDIB);//返回return(hDIB);}//将指向图像象素起始位置的指针,赋值给指针变量BYTE* oldbuf = pScrBuff;//循环变量int i,j,m,n;int w, h, dw;//获取图像的宽度w = (int) ::DIBWidth((char *)lpDIB);//获取图像的高度h = (int) ::DIBHeight((char *)lpDIB);//计算图像每行的字节数dw = (w+3)/4*4;//建立一个和原图像大小相同的25色灰度位图HDIB newhDIB=NewDIB(w,h,8);//指向新的位图的指针BYTE *newlpDIB=(BYTE*)::GlobalLock((HGLOBAL) newhDIB);//指向新的位图的象素起始位置的指针BYTE *destBuf = (BYTE*)FindDIBBits((char *)newlpDIB);//将指向新图像象素起始位置的指针,赋值给指针变量BYTE *newbuf=destBuf;//对图像进行扫描//行for(i=0;i<h;i++){//列for(j=0;j<w;j++){//为统计变量赋初始值sum=0;//对于图像的4个边框的象素保持原灰度不变if( j<((tem_w-1)/2) || j>(w-(tem_w+1)/2) || i<((tem_h-1)/2) || i>(h-(tem_h+1)/2) )*(newbuf+i*dw+j)=*(oldbuf+i*dw+j);//对于其他的象素进行模板操作else{//将点(i,j)点作为模板的中心for(m=i-((tem_h-1)/2);m<=i+((tem_h-1)/2);m++){for(n=j-((tem_w-1)/2);n<=j+((tem_w-1)/2);n++)//将以点(i,j)为中心,与模板大小相同的范围内的象素与模板对用位置的系数//进行相乘并线形叠加sum+=*(oldbuf+m*dw+n)*tem[(m-i+((tem_h-1)/2))*tem_w+n-j+((tem_w-1)/2)];}//将结果乘上总的模板系数sum=(int)sum*xishu;//计算绝对值sum = fabs(sum);//如果小于0,强制赋值为0if(sum<0)sum=0;//如果大于255,强制赋值为255if(sum>255)sum=255;//将计算的结果放到新的位图的相应位置*(newbuf+i*dw+j)=sum;}}}//解除锁定::GlobalUnlock((HGLOBAL)hDIB);//返回新的位图的句柄return(newhDIB);}图像的锐化图像处理结果:程序代码:能:* 现图像的梯度锐化*说明:* 只能对2值图像进行处理,如果图像本身边缘较细,可能造成信息的损失********************************************************************* */void GradientSharp(HDIB hDIB){// 指向DIB的指针LPSTR lpDIB=(LPSTR) ::GlobalLock((HGLOBAL)hDIB); // 指向DIB象素指针LPSTR lpDIBBits;// 找到DIB图像象素起始位置lpDIBBits = ::FindDIBBits(lpDIB);//获取图像的宽度LONG lWidth=::DIBWidth ((char*)lpDIB);//获取图像的长度LONG lHeight=::DIBHeight ((char*)lpDIB);// 阈值BYTE bThre = 2;// 调用GradSharp()函数进行梯度板锐化// 指向源图像的指针unsigned char* lpSrc;unsigned char* lpSrc1;unsigned char* lpSrc2;// 循环变量LONG i;LONG j;// 图像每行的字节数LONG lLineBytes;// 中间变量BYTE bTemp;// 计算图像每行的字节数lLineBytes = WIDTHBYTES(lWidth * 8);// 每行for(i = 0; i < lHeight; i++){// 每列for(j = 0; j < lWidth; j++){// 指向DIB第i行,第j个象素的指针lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;// 指向DIB第i+1行,第j个象素的指针lpSrc1 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 2 - i) + j;// 指向DIB第i行,第j+1个象素的指针lpSrc2 = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j + 1;//计算梯度值bTemp = abs((*lpSrc)-(*lpSrc1)) + abs((*lpSrc)-(*lpSrc2));// 判断是否小于阈值if (bTemp < 255){// 判断是否大于阈值,对于小于情况,灰度值不变。

if (bTemp >= bThre){// 直接赋值为bTemp*lpSrc = bTemp;}}else{// 直接赋值为255*lpSrc = 255;}}}//最后还要处理一下图像中最下面那行for(j = 0; j < lWidth; j++){//指向最下边一行,第j个象素的指针lpSrc = (unsigned char*)lpDIBBits + lLineBytes * 0 + j;//将此位置的象素设置为255,即白点*lpSrc=255;}//解除锁定::GlobalUnlock ((HGLOBAL)hDIB);}。

相关主题