图像灰度化图像灰度化原理:关于YUV空间的彩色图像,其Y的分量的物理意义本身就是像素点的亮度,由该值反映亮度等级,因此可根据RGB和YUV颜色空间的变化关系建立亮度Y与R、G、B三个颜色分量的对应:Y=++,以这个亮度值表达图像的灰度值图像处理结果:程序代码:char*pmydata; //定义一个指针用来指向位图图像数据在内存中的存储区域//longwide,high; BITMAPbm;pbmp->GetBitmap(&bm);pmydata=newchar[*]; //根据位图的高度宽度初始化一下pbmp->GetBitmapBits(*,pmydata);//将位图对象的数据COPY到pmydata指向的区域,m_bm是位图对象,bm是位图结构,可参考上一篇文章的定义for(inti=0;i<*;i+=4)//因为一个像素有4个字节,故i+=4{ charY=0;Y=(pmydata[i]*+pmydata[i+1]*+pmydata[i+2]*);pmydata[i]=Y;//Rpmydata[i+1]=Y;//Gpmydata[i+2]=Y;//B}pbmp->SetBitmapBits(*,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,图像处理结果:程序代码:voidCMyDIPView::OnMenuitem32778(){//TODO:mandhandlercodehereCMyDIPDoc*pDoc=GetDocument();//设定模板参数doubletem[9]={1,1,1,1,1,1,1,1,1};//设定模板系数double xishu=; //进行模板操作pDoc->m_hDIB=Template(pDoc->m_hDIB,tem,3,3,xishu);//调用Template函数,对图像进行模板操作)Invalidate(TRUE);}HDIBTemplate(HDIBhDIB,double*tem,inttem_w,inttem_h,doublexishu){//统计中间值doublesum;//指向图像起始位置的指针BYTE*lpDIB=(BYTE*)::GlobalLock((HGLOBAL)hDIB);//指向象素起始位置的指针BYTE*pScrBuff=(BYTE*)::FindDIBBits((char*)lpDIB);//获取图像的颜色信息intnumColors=(int)::DIBNumColors((char*)lpDIB);//如果图像不是256色返回if(numColors!=256){ //解除锁定::GlobalUnlock((HGLOBAL)hDIB);//返回return(hDIB);}//将指向图像象素起始位置的指针,赋值给指针变量BYTE*oldbuf=pScrBuff;//循环变量inti,j,m,n;intw,h,dw;//获取图像的宽度w=(int)::DIBWidth((char*)lpDIB);//获取图像的高度h=(int)::DIBHeight((char*)lpDIB);//计算图像每行的字节数dw=(w+3)/4*4; //建立一个和原图像大小相同的25色灰度位图HDIBnewhDIB=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)
图像灰度化 来自淘豆网m.daumloan.com转载请标明出处.