图像灰度化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图像灰度化
图像灰度化原理:关于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 个字节,故i+=4 { char Y=0; Y=(pmydata[i]*0.299+pmydata[i+1]*0.5876+pmydata[i+2]*0.114); pmydata[i]=Y;//R pmydata[i+1]=Y;//G pmydata[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 { //列 for(j=0;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 {