图像的分割和灰度处理(VC++实现)
来源:互联网 发布:蔡司三坐标软件 编辑:程序博客网 时间:2024/05/18 19:20
备注:本文所有操作都是基于Windows的位图句柄HBITMAP的。
1、首先,VC++为了支持多图片格式,我引用了GDI+来加载各种图像。
GDI+使用前,切记:
#include <GdiPlus.h>
#pragma comment (lib,"GdiPlus")
程序开始时:
Gdiplus::GdiplusStartup(&m_pGdiplus,&m_GdiplusSt,NULL);
程序终止前:
Gdiplus::GdiplusShutdown(m_pGdiplus);
2、图像的分割实现,主要方法就是把图像的句柄放到一个内存兼容DC上,再创建一个内存兼容DC和一个内存兼容位图句柄,通过BitBlt你想怎么切都可以,实际上就是一个DC区域拷贝的问题。
贴代码:
HBITMAP CImageDemoDlg::GetBitmapRect( HDC hDC, const CRect& rect ){ASSERT(hDC);HDChDesDC=NULL;hDesDC=CreateCompatibleDC(hDC);HBITMAP hDesBitmap=CreateCompatibleBitmap(hDC,rect.Width(),rect.Height());HBITMAP hOldBitmap=(HBITMAP)::SelectObject(hDesDC,hDesBitmap);::BitBlt(hDesDC,0,0,rect.Width(),rect.Height(),\hDC,rect.left,rect.top,SRCCOPY);hDesBitmap=(HBITMAP)::SelectObject(hDesDC,hOldBitmap);DeleteDC(hDesDC);return hDesBitmap;}
3、接着就是彩色图像转灰度图像了,这个相当简单,用GetBitmapBits把位图颜色值写入内存中,然后把像素值一个个地读出来转换成灰度颜色,然后写到内存里,再用SetBitmapBits写到原来的那个位图句柄中,OK,灰度图转换完成。
贴代码:
//灰度处理#define GET_GRAY_VALUE(x) 0.110*GetBValue(x)+0.588*GetGValue(x)+0.302*GetRValue(x)HBITMAP CImageDemoDlg::GetGrayBitmap( HBITMAP hResBitmap ,int& nWhiteCount,int& nBackCount){nWhiteCount=0;nBackCount=0;ASSERT(hResBitmap);HBITMAP hDesBitmap=NULL;BITMAP bm;GetObject(hResBitmap,sizeof(bm),&bm);LONG lSize=bm.bmWidth*bm.bmBitsPixel*bm.bmHeight/8;int nSize=bm.bmWidth*bm.bmHeight/10;HLOCAL hMem=LocalAlloc(LHND,lSize);byte* pData=(byte*)LocalLock(hMem);::GetBitmapBits(hResBitmap,lSize,pData);byte* pHead=pData;byte* pTail=pData+lSize-4;DWORD dwColor1=0;DWORD dwColor2=0;byte bGray1=0;byte bGray2=0;while ( pTail>pHead ){memcpy(&dwColor1,pHead,4);memcpy(&dwColor2,pTail,4);bGray1=GET_GRAY_VALUE(dwColor1);if ( bGray1<128 )nBackCount++;elsenWhiteCount++;bGray2=GET_GRAY_VALUE(dwColor2);if ( bGray2<128 )nBackCount++;elsenWhiteCount++;dwColor1=RGB(bGray1,bGray1,bGray1);dwColor2=RGB(bGray2,bGray2,bGray2);memcpy(pHead,&dwColor1,4);memcpy(pTail,&dwColor2,4);pHead+=4;pTail-=4;}HDC hDC=::GetDC(m_hWnd);hDesBitmap=CreateCompatibleBitmap(hDC,bm.bmWidth,bm.bmHeight);LONG lRet=::SetBitmapBits(hDesBitmap,lSize,pData);LocalUnlock(hMem);LocalFree(hMem);::ReleaseDC(m_hWnd,hDC);return hDesBitmap;}
4、统计黑白像素点的个数和所占比例
在进行像素的变换时已经对这个进行了记录,接下来用GDI的画刷把比例图画出来。
5、在OnDraw中把原图、分割图、灰度分割图、黑色像素比例图绘制出来。
效果图:
源码下载地址:代码
欢迎指教。
- 图像的分割和灰度处理(VC++实现)
- 灰度图像的膨胀操作(vc实现)
- 灰度图像--图像分割 阈值处理综述
- 灰度图像腐蚀(vc实现)
- 图像处理--灰度图像伪彩色(MFC VC++)
- 图像基本处理系列:灰度处理(1):灰度图像和灰度直方图
- 图像的灰度化原理和实现
- 图像的灰度化原理和实现
- 图像的灰度化原理和实现
- 灰度图像的自动阈值分割(Otsu 法)
- 灰度图像--图像分割 阈值处理之平均阈值
- 灰度图像--图像分割 阈值处理之P-Tile阈值
- 灰度图像--图像分割 阈值处理之OTSU阈值
- 灰度图像--图像分割 阈值处理之补充说明
- 灰度图像--图像分割 阈值处理之局部阈值
- 图像灰度分割
- 图像处理 灰度的线性变换
- 灰度图像的形态学处理
- python学习笔记1
- 使用受限的随机游动进行交互式网格切割
- UILabel的各种属性与方法的使用(转)
- 微博数据的抓取---正则表达式的构想
- XML-世界上最难学的语言,我的XML创新之路(1)
- 图像的分割和灰度处理(VC++实现)
- 黑马程序员——高新技术(银行业务调度系统)
- 关于Android设备屏幕大小及密度的系统参数类
- 到底要下载哪个?ubuntu-releases 镜像详解
- C#装箱与拆箱
- 很嗨网络收音机
- 2014 --雅虎校招
- hdu-1259-ZJUTACM
- 关于读书的几个问题