2012-03-17 10:07:42|?次阅读|上传:wustguangh【已有?条评论】发表评论
关键词:C/C++, MFC, 图形/图像|来源:唯设编程网
VC编程进行位图的像素操作(灰度化)介绍了VC对位图图像灰度化处理,本文继续介绍位图处理类CImageUtility的其它成员方法,限于篇幅,本文着重介绍VC编程实现图像二值化、位图反相的算法和具体实现。
// 图像极值化(二值话)处理 // limen-阈值(0.0-100.0) void CImageUtility::ImageExtreamProcess(double limen) { // 目前只处理24位以上的位图 if(nPixBytes <3) return; //定义RGB存储空间 int nRGB[3]; //定义LAB储存空间 double fLAB[3]; for(long nHeight=0; nHeight<bmSrcInfo.bmHeight; nHeight++) { for(long nWidth=0; nWidth<bmSrcInfo.bmWidth; nWidth++) { //获取对应像素点得颜色 getPixelColor(nRGB,nHeight,nWidth); //RGB转换成LAB CColorUtility::_cie_rgb2lab(nRGB,fLAB); if(fLAB[0]>limen){ nRGB[0]=255; nRGB[1]=255; nRGB[2]=255; }else{ nRGB[0]=0; nRGB[1]=0; nRGB[2]=0; } //设置像素点颜色 setPixelColor(nRGB,nHeight,nWidth); } } bmpSrc->SetBitmapBits(dwBmByteSize, pBmBits); }
图像二值化的方法是:逐个像素获取位图(BMP)图像的颜色信息,并将其转换成LAB色彩空间,将LAB的L(亮度)分量与形参传递的阈值进行比较,L(亮度)分量大于阈值则将RGB三个分亮亮均设置成255,也即是白色,如果LAB的L(亮度)分量小于形参传递的阈值则将RGB三个分亮亮均设置成0,也即是黑色。
//反相 void CImageUtility::ImageReverseProcess(){ // 目前只处理24位以上的位图 if(nPixBytes <3) return; //定义RGB存储空间 int nRGB[3]; for(long nHeight=0; nHeight<bmSrcInfo.bmHeight; nHeight++) { for(long nWidth=0; nWidth<bmSrcInfo.bmWidth; nWidth++) { //获取对应像素点得颜色 getPixelColor(nRGB,nHeight,nWidth); //对每位颜色取反 nRGB[0]=255-nRGB[0]; nRGB[1]=255-nRGB[1]; nRGB[2]=255-nRGB[2]; //设置像素点颜色 setPixelColor(nRGB,nHeight,nWidth); } } bmpSrc->SetBitmapBits(dwBmByteSize, pBmBits); }
位图反相的方法是:逐个像素获取位图(BMP)图像的RGB颜色信息,将RGB各分量设置成对应分量与255的差的绝对值。