图像灰度化

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

{

相关文档
最新文档