MFC对话框绘制灰度直方图Word版

上传人:桔**** 文档编号:508126756 上传时间:2023-04-17 格式:DOC 页数:15 大小:1.26MB
返回 下载 相关 举报
MFC对话框绘制灰度直方图Word版_第1页
第1页 / 共15页
MFC对话框绘制灰度直方图Word版_第2页
第2页 / 共15页
MFC对话框绘制灰度直方图Word版_第3页
第3页 / 共15页
MFC对话框绘制灰度直方图Word版_第4页
第4页 / 共15页
MFC对话框绘制灰度直方图Word版_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《MFC对话框绘制灰度直方图Word版》由会员分享,可在线阅读,更多相关《MFC对话框绘制灰度直方图Word版(15页珍藏版)》请在金锄头文库上搜索。

1、MFC对话框绘制灰度直方图一. 程序运行结果 该篇文章主要是在上一篇文章基础上进行的讲解,其中当打开一张BMP图像后,点击”直方图“-”显示原图直方图“如下。推荐精选二. 灰度直方图原理 什么是灰度直方图? 灰度直方图(histogram)是灰度级的函数,描述的是图像中每种灰度级像素的个数,反映图像中每种灰度出现的频率。横坐标是灰度级,纵坐标是灰度级出现的频率。 对于连续图像,平滑地从中心的高灰度级变化到边缘的低灰度级。直方图定义为: 其中A(D)为阈值面积函数:为一幅连续图像中被具有灰度级D的所有轮廓线所包围的面积。对于离散函数,固定D为1,则:H(D)=A(D)-A(D+1) 色彩直方图是

2、高维直方图的特例,它统计色彩的出现频率,即色彩概率分布信息。 通常这需要一定的量化过程,将色彩分成若干互不重叠的种类。一般不直接在RGB色彩空间中统计,而是在将亮度分离出来后,对代表色彩部分的信息进行统计,如在HSI空间的HS子空间、YUV空间的UV子空间,以及其它反映人类视觉特点的彩色空间表示中进行。 其中直方图的计算方法如下: 依据定义,若图像具有L(通常L=256,即8位灰度级)级灰度,则大小为MxN的灰度图像f(x,y)的灰度直方图hist0L-1可用如下计算获得。 1、初始化 histk=0; k=0,L-1 2、统计 histf(x,y)+; x=0,M-1, y =0,N-1推荐

3、精选 3、归一化 histf(x,y)/=M*N 那么说了这么多,直方图究竟有什么作用呢? 在使用轮廓线确定物体边界时,通过直方图更好的选择边界阈值,进行阈值化处理;对物体与背景有较强对比的景物的分割特别有用;简单物体的面积和综合光密度IOD可以通过图像的直方图求得。三. 程序实现1.建立直方图对话框 第一步:创建Dialog 将视图切换到ResourceView界面,选中Dialog右键鼠标新建一个Dialog,并新建一个名为IDD_DIALOG_ZFT,设置成下图对话框。 右键添加属性如下: 对话框-原始直方图-IDD_DIALOG_ZFT 组框-RGB-IDC_STATIC_RGB 图像

4、-框架-IDC_STATIC_KJ-蚀刻(重点:有它才能添加直方图在此处,注意GetDlgItem()函数中是IDC而不是IDD对话框)推荐精选 添加蚀刻线(图像蚀刻形成的直线)形如图中的3个矩形框,并添加静态文本:Red、Green、Blue、红、绿、蓝、像素、平均灰度、中值灰度、标准差;这些静态文本都是IDC_STATIC且为默认属性 添加红色4个值(Static)、绿色4个值、蓝色4个值,分别为: IDC_STATIC_XS_RED(GREEN BLUE)对应像素XS IDC_STATIC_PJHD_RED(GREEN BLUE)对应平均灰度PJHD IDC_STATIC_ZZHD_RE

5、D(GREED BLUE)对应中值灰度ZZHD IDC_STATIC_BZC_RED(GREEN BLUE)对应标准差BZC 第二步:建立类向导MFC ClassWizard (1) 在对话框资源模板空白区双击鼠标(Ctrl+W),创建一个新类,命名为CImageZFTDlg会自动生成它的.h和.cpp文件。在类向导中选中类名CImageZFTDlg,IDs为CImageZFTDlg,WM_INITDIALOG建立这个函数用于初始化。 (2) 打开类向导,选择Member Variables页面,添加如下变量,类型均为CString。 像素 m_redXS、m_greenXS、m_blueXS

6、 标准差 m_redBZC、m_greeenBZC、m_blueBZC 平均灰度 m_redPJHD、m_greenPJHD、m_bluePJHD 中值灰度 m_redZZHD、m_greenZZHD、m_blueZZHD (3) 在View.cpp中添加直方图的头文件 #inlcude ImageZFTDlg.h 第三步:设置菜单栏调用直方图对话框 (1) 将视图切换到ResourceView界面,选中Menu,在IDR_MAINFRAM中添加菜单项“直方图”,菜单属性中选择“弹出”,在“直方图”中添加子菜单“显示原图直方图”。推荐精选 (2) 设置其属性为ID_ZFT_YT(显示直方图原图

7、),同时建立类向导,选择ID_ZFT_YT(IDs),通过COMMAND建立显示直方图函数OnZftYt()。 第四步:添加代码及计算4个值 在ImageProcessingView.cpp中添加如下代码,注释中有如何求平均灰度、中值灰度和标准差的消息算法过程。cppview plaincopy1. /引用显示直方图头文件2. #includeImageZFTDlg.h3. #includemath.h4. 5. /*全局变量在TestZFTDlg.cpp中引用用extern*/6. intRed256,Green256,Blue256;7. 8. /*/9. /*添加直方图显示功能,并在直方

8、图下方显示相关信息10. /*如平均灰度、中值灰度、标准差和像素总数11. /*ID_ZFT_YT:直方图原图显示12. /*/13. voidCImageProcessingView:OnZftYt()14. 15. if(numPicture=0)16. AfxMessageBox(载入图片后才能显示原图直方图!,MB_OK,0);17. return;18. 19. AfxMessageBox(显示原图直方图!,MB_OK,0);推荐精选20. CImageZFTDlgdlg;21. 22. /打开临时的图片23. FILE*fpo=fopen(BmpName,rb);24. fread

9、(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);25. fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);26. 27. inti,j;28. for(j=0;j256;j+)/定义数组并清零29. Redj=0;30. Greenj=0;31. Bluej=0;32. 33. 34. /计算4个数据35. unsignedcharred,green,blue;36. intIntRed,IntGreen,IntBlue;/强制转换37. doublesumRedHD=0,sumGreenHD=0,sumBlueHD=0;/记录像

10、素总的灰度值和38. for(i=0;i=0&IntRed=0&IntGreen=0&IntBlue256)BlueIntBlue+;54. 55. fclose(fpo);56. 57. /像素:int型转换为CString型58. dlg.m_redXS.Format(%d,m_nImage);59. dlg.m_greenXS.Format(%d,m_nImage);60. dlg.m_blueXS.Format(%d,m_nImage);61. 62. /平均灰度值:计算24位bmp图片的灰度值,我是记录RGB中的所有平均值63. floatpinRedHD,pinGreenHD,pinBlueHD;推荐精选64. pinRedHD=sumRedHD*3/m_nImage;65. pinGreenHD=sumGreenHD*3/m_nImage;/平均灰度=总灰度/总像素66. pinBlueHD=sumBlueHD*3/m_nImage;67. 68. dlg.m_redPJHD.Format(%.2f,pinRedHD);69. dlg.m_greenPJHD.Format(%.2f,pinGreenHD);70. dlg.m_bluePJHD.Format(%.2f,pinBlueHD);71. 72. /*

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号