版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、图像的点运算图像的点运算是图像处理中相对简单的技术,它主要用于改变一幅图像的灰度分布范围。点运算通过一个变换函数将图像的像素一一转换,最终构成一幅新的图像。由于操作对象是图像的一个个像素,故得名为“点运算”。点运算的最大特点是输出像素值只与当前输入像素值有关。点运算的图像处理过程可以用以下公式表示:g(x,y)=Tf(x,y)其中f(x,y)表示输入图像,g(x,y)表示处理后的图像。函数T是对f的一种变换操作,在这里它表示灰度变换公式。可以看到,对于点运算而言,最重要的是确定灰度变换公式。变换公式一旦确定,点运算对于图像的处理效果就确定了。本章研究的主要内容包括灰度直方图、线性变换、非线性变
2、换、阈值变换、灰度拉伸及灰度均衡等。若无特别说明,本章的点运算函数所针对的待处理对象即为8位灰度图。本章学习地图学会利用灰度直方图查看图像信息了解各种灰度变换公式掌握各种灰度变换的实现方法进一步了解各种点运算对于图像效果的影响灰度直方图本节介绍灰度直方图的相关概念和实现原理,它是提取图像信息的重要工具之灰度直方图任何一幅图像都包含着丰富的图像信息,对于图像处理而言,如何提取这些信息并找出其中的特征就显得十分关键。灰度直方图直观地显示了图像灰度分布的情况,这些信息在图像灰度变换等处理过程中显得十分重要。在本章随后的内容中,也会经常通过直方图来分析变换后的图像效果。图9-1显示一幅灰度图及它所对应
3、的灰度直方图。可以看到,灰度直方图是一个二维图。从数学上来说,它描绘了图像各灰度值的统计特性,显示了各个灰度级出现的次数或概率。从图形上来说,其横坐标表示图像的灰度值,取值范围是0到255。其纵坐标则通过高度来表示出现次数的多少或者概率的高低。在本章中,纵坐标表示像素出现的次数,最大值为该图像在0至255阶灰度上分布像素出现次数的最大值。图9-1利用灰度直方图显示图像灰度分布需要说明的是,如果没有特别指出,在本章后续内容中的所有变换都是基于图9-1中左侧的图像进行的。接下来分析直方图的作用。图9-2所示的4幅图像都是根据同一幅图像进行基本灰度特征处理后获得的,分别是高亮度、低亮度、高对比度、低
4、对比度4种类型的图像。每幅图像右侧都显示了对应的直方图。仔细观察可以发现如下特征。讪低岳废-閱庭显:示J!卜5霽陇时比庞叩S融小權【聲KU-.W图9-24种基本图像及对应的直方图高亮度图像的直方图组成集中在灰度高的一侧。8位灰度图能表示256种灰度,也就是灰度取值范围为0至255。其中0表示黑色,255表示白色。对于高亮度图像,整个画面的颜色偏亮,故灰度直方图偏向灰度高的一侧。相反,低亮度图像的直方图则偏向灰度较低的一侧。在高对比度的图像中,直方图的覆盖范围很广。图像在任意一段灰度范围中都有一定的像素数量。同时,高对比图像的灰度分布相比其他图像而言较为均匀,整个直方图显得比较平滑。而低对比度图
5、像的灰度则主要分布在中间狭窄的区域中,图像就像被冲淡了一样。基本原理灰度直方图的基本思想是统计。对于拥有256种灰度的图像,灰度值为k的像素个数由一个离散函数确定:其中n表示当前图像灰度值为k的像素个数,则对应的出现概率可以使用如下k公式表示:,显然有成立。其中n表示图像像素个数的总和,可以用图像宽度与高度的乘积来表示。本章灰度直方图的坐标系为。横坐标表示输入灰度值k,而纵坐标表示对应灰度值的统计个数n。可见,绘制直方图最重要的是确定灰度值为k的像素个数。直方图在绘制时采用相对高度,即纵坐标的最大值为y二max(n,n,n,n,n),如果y的绘制高度为1,灰度值k的绘制高度max0122542
6、55max9.13编程实现1效果预览本节通过对话框实现灰度直方图的显示,其效果见图9-3所示。图9-3灰度直方图对话框灰度直方图对话框实现了如下功能。l灰度直方图的显示。l允许用户修改显示灰度的上限和下限。对于一些图像而言,可能某个像素值的计数远远大于其他像素的个数,这样往往看不清其他灰度的分布。例如白色背景的图片,拥有灰度值255的像素个数相对较多。该对话框提供了一个灰度区间显示的功能,如图9-4所示。jfcwnn匚M抽古雷显I44出囲Hti卜碌I呷II.*J图9-4灰度直方图的区间显示可以看到,改变显示灰度的范围后,用户能够更加清楚地了解某一区域的灰度分布特征。l允许用户通过鼠标操作来改变
7、显示灰度的上限和下限。方法很简单,只需要拖动对话框上两侧的蓝色虚线即可。l显示当前鼠标所在位置的灰度值及出现的几率。2构建MagicHouseMagicHouse是贯穿本书第3篇的重点实例。它是一款以图像处理为主,综合图像浏览等多种功能的实用软件。MagicHouse支持多种常见图片格式,并实现了以下功能。l图像的浏览l图像的特效显示l图像的点运算l图像的几何变换l图像的增强l图像的滤镜效果本章将完成MagicHouse框架的搭建工作并在其基础上添加点运算的功能,随后的3章内容都是在已有的MagicHouse框架上进行功能的完善和补充的。MagicHouse框架是在第8章实例GraphShow
8、er的基础上改进的,它继承了GraphShower的框架结构和图像浏览、特效显示等功能,并新增了如下功能。1)运行模式添加了“运行模式”菜单,提供两种运行模式:图片浏览模式,该模式功能与GraphShower完全相同,提供图像的浏览功能;编辑模式,这个模式允许对图像进行各种处理,本章及后面3章的功能都是在该模式下实现的。编辑模式下的图像会被锁定,不能进行图像的浏览。JPEG解码器MagicHouse使用了第4章编写的JPEG解码器完成JPEG文件的解码工作。用户只需要将第4章的对应文件添加到MagicHouse的工程下即可。Dib封装类MagicHouse使用第5章介绍的MyDib类获取Bmp
9、文件的像素信息,MagicHouse支持的图像为8位灰度图与24位、32位彩色图像。预览对话框预览对话框用于显示图像处理后的效果图。它与第5章中介绍的CPreViewDlg类很类似,不同的是这里采用GDI+显示图像。统一的图像处理接口MagicHouse的核心是CMagicHouseView类,它不但提供了图像的显示和处理功能,还提供了图像的处理接口。下面是CMagicHouseView类中关于图像处理十分重要的成员变量。public:BYTE*m_pImageBuffer;/编辑图像原始像素数组BYTE*m_pImageTempBuffer;/处理后的像素数组UINTm_nPicWidth;
10、/当前编辑图像宽度UINT编辑图像高度m_nPicHeight;/当前UINTm_nTempWidth;/处理后图像的宽度UINT图像的高度m_nTempHeight;/处理后在编辑模式下,所有图像都会保存在一个线性数组中,且图像的每一个像素都是以32位的形式保存的。图像处理函数可以通过m_pImageBuffer指针获取原始图像信息,然后将处理后的图像保存在另一个线性数组中。处理后的图像信息可以通过m_pImageTempBuffer指针访问。最后通过预览对话框显示处理后的图像效果。后续的图像处理函数会经常使用这6个变量。MagicHouse拥有良好的可扩展性,它对底层的解析过程进行了良好的
11、封装,并采用统一的接口对图像进行处理,它不仅是一款数字图像处理工具,更是一款理想的数字图像算法试验平台,读者可以在其基础上扩展更多的图像处理功能。由于篇幅有限,这里不再给出MagicHouse框架的代码,读者可到指定网站下载。3.概要设计下面开始完成灰度直方图对话框的设计。启动MagicHouse项目文件,打开“资源视图”,添加ID为IDD_HISTOGRAM的对话框资源并按照图9-5完成设计。然后为其创建对话框类CHistogramDlg并按照表9-1关联对应变量。图9-5灰度直方图对话框的设计表9-1灰度直方图对话框资源与变量的关系编号资源类型资源ID关联变量类型关联变量名称1图片控件ID
12、C_HISTOGRAMCStaticm_stiHistogram2文本框IDC_LIMIT_LOWERintm_nLimitLow3文本框IDC_LIMIT_UPintm_nLimitUp4静态文本IDC_STATIC_GRAYintM_nGray5静态文本IDCSTATICPERfloatMdPer4代码分析F面结合灰度直方图的基本原理一步一步剖析对话框的实现过程。1)各级灰度数量的统计统计数据是绘制灰度直方图的依据。该对话框在初始化时,也就是在OnInitDialog函数中完成统计工作。正如前面介绍的一样,MagicHouse将图像保存在一个线性数组中,图像的每个像素都统一采用32位形式存
13、储,故8位灰度图的一个像素也会占用32位。为方便统计,对话框默认当前处理图像为灰度图,即R=G=B,故每次只需要统计其中一种颜色的数量。2)灰度直方图重绘过程绘制工作主要由Refresh函数完成,它完成了以下功能。l双缓存的创建以双缓存模式绘制直方图,防止闪烁。l绘制直方图的坐标系和刻度l查找所有灰度中最多的出现次数该次数会显示在Y轴的旁边,拥有该次数灰度值的直方图最高。l以相对高度绘制直方图其余灰度值的高度由其出现次数与最大出现次数的比值决定。l利用鼠标操作改变显示灰度的上下限灰度上下限在对话框中以两条蓝色的虚线表示,用户可以通过鼠标操作改变两条虚线的位置来改变显示灰度的上下限。用户在单击鼠
14、标左键时程序会根据当前鼠标的位置,判断鼠标是否在上下限虚线的范围内。如果在上限虚线的范围中,则将m_nIsDraging变量赋值为DT_UP,如果在下限虚线的范围中,则赋值为DT_LOW,否则赋值为DT_NULL。用户在移动鼠标时如果m_nIsDraging不为DT_NULL,则表示用户此时正在拖动上限或者下限的虚线,此时就需要更改上下限的值,并将其限定在合法的取值范围中。5实例代码清单下面列出HistogramDlg.h的代码清单:#pragmaonce#includeafxwin.h/CHistogramDlg对话框classCHistogramDlg:publicCDialogDECLA
15、RE_MESSAGE_MAP()DECLARE_DYNAMIC(CHistogramDlg)public:CStaticm_stiHistogram;图显示区域intm_nLimitLow;/显示灰度的下限intm_nLimitUp;灰度的上限longm_lCounts256;各级灰度出现的个数longm_nPixelCount;图像像素总数CPointm_psMove;拖动时的鼠标位置intm_nIsDraging;否正在拖动intm_nGray;/当前鼠标位置的灰度级数floatm_dPer;现概率CHistogramDlg(CWnd*pParent=NULL);数virtualCHist
16、ogramDlg();afx_msgvoidOnEnChangeLimitLower();变的响应函数/直方/显示/记录/鼠标是/出/标准构造函/灰度下限改灰度上限改变的afx_msgvoidOnEnChangeLimitUp();/响应函数/绘制afx_msgvoidOnPaint();对话框virtualBOOLOnInitDialog();/对话框初始化时计算各级灰度数量afx_msgvoidOnMouseMove(UINTnFlags,CPointpoint);/鼠标移动时响应拖动动作afx_msgBOOLOnSetCursor(CWnd*pWnd,UINTnHitTest,UINTm
17、essage);/拖动时改变鼠标光标afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);/鼠标按下时判断是否在灰度上下限直线范围中afx_msgvoidOnLButtonUp(UINTnFlags,CPointpoint);/释放鼠标的响应函数/对话框数据enumIDD=IDD_HISTOGRAM;protected:virtualvoidDoDataExchange(CDataExchange*pDX);/DDX/DDV支持private:voidRefresh(void);/刷新直方图/拖动枚举enumDragingTypeDT_NULL,/无
18、拖动DT_LOW,/拖动下限DT_UP/拖动上限;下面列出HistogramDlg.h的核心代码清单:/HistogramDlg.cpp:实现文件#includestdafx.h#includeMagicHouse.h#includeHistogramDlg.h#includeMainfrm.h#includeMagicHouseDoc.h#includeMagicHouseView.h/CHistogramDlg消息处理程序/*作用:对话框初始化时计算各级灰度数量*/BOOLCHistogramDlg:OnInitDialog()CDialog:OnInitDialog();CMainFra
19、me*pMain=(CMainFrame*)AfxGetMainWnd();CMagicHouseView*pView=(CMagicHouseView*)pMain-GetActiveView();for(UINTi=0;im_nPicWidth*pView-m_nPicHeight;i+)intvalue=pView-m_pImageTempBufferi*4;m_lCountsvalue+;/计算像素总个数m_nPixelCount=pView-m_nPicWidth*pView-m_nPicHeight;returnTRUE;/returnTRUEunlessyousetthefocu
20、stoacontrol/异常:OCX属性页应返回FALSE/*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*J*Jfp*Y*Y*作用:刷新直方图*备注:双缓存绘制方法*/voidCHistogramDlg:Refresh()CDC*pDC=m_stiHistogram.GetDC();CRectrect;CDCmemDC;CBitmapMemBitmap;/获取绘图区域m
21、_stiHistogram.GetClientRect(rect);/设备描述表初始化memDC.CreateCompatibleDC(NULL);/建立与屏幕显示兼容的内存显示设备MemBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height();/选取空白位图memDC.SelectObject(MemBitmap);memDC.FillSolidRect(0,0,rect.Width(),rect.Height(),RGB(255,255,255);Graphicsgraph(memDC.GetSafeHdc();/使用白色背景
22、graph.FillRectangles(&SolidBrush(Color:White),&Rect(0,0,rect.Width(),rect.Height(),1);/绘制y轴graph.DrawLine(&Pen(Color:Black),10,10,10,280);graph.DrawLine(&Pen(Color:Black),10,10,5,15);graph.DrawLine(&Pen(Color:Black),10,10,15,15);/绘制X轴graph.DrawLine(&Pen(Color:Black),10,280,290,280);graph.DrawLine(&P
23、en(Color:Black),290,280,285,285)graph.DrawLine(&Pen(Color:Black),290,280,285,275)/绘制坐标原点CStringstrNum;Fontfont(L宋体,10);strNum=L0;graph.DrawString(strNum,-1,&font,PointF(8,290),&SolidBrush(Color:Black);for(inti=0;i256;i+=5)if(i%50=0)graph.DrawLine(&Pen(Color:Black),10+i,280,10+i,286);elseif(i%10=0)gr
24、aph.DrawLine(&Pen(Color:Black),10+i,280,10+i,283);/绘制x轴刻度strNum=L50;graph.DrawString(strNum,-1,&font,PointF(53,290),&SolidBrush(Color:Black);strNum=L100;graph.DrawString(strNum,-1,&font,PointF(100,290),&SolidBrush(Color:Black);strNum=L150;graph.DrawString(strNum,-1,&font,PointF(150,290),&SolidBrush(
25、Color:Black);strNum=L200;graph.DrawString(strNum,-1,&font,PointF(200,290),&SolidBrush(Color:Black);strNum=L255;graph.DrawString(strNum,-1,&font,PointF(255,290),&SolidBrush(Color:Black);/绘制当前灰度区域Penpen(Color:Blue);pen.SetDashStyle(DashStyleDash);graph.DrawLine(&pen,10+m_nLimitLow,280,10+m_nLimitLow,1
26、0);graph.DrawLine(&pen,10+m_nLimitUp,280,10+m_nLimitUp,10);longlMax=0;REALdHeight=0.0;/查找最大值for(inti=m_nLimitLow;i=m_nLimitUp;i+)lMax=max(lMax,m_lCountsi);/y轴刻度strNum.Format(L%d,lMax);graph.DrawString(strNum,-1,&font,PointF(10,25),&SolidBrush(Color:Black);/绘制柱状图for(inti=m_nLimitLow;iBitBlt(0,0,rect.
27、Width(),rect.Height(),&memDC,0,0,SRCCOPY);m_stiHistogram.ReleaseDC(pDC);/*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*1*J*Jfp*Y*Y*作用:鼠标移动时响应拖动动作*/voidCHistogramDlg:OnMouseMove(UINTnFlags,CPointpoint)CRectrect;m
28、_stiHistogram.GetWindowRect(rect);if(nFlags&MK_LBUTTON)&m_nIsDraging)/拖动偏移量intoffset=point.x-m_psMove.x;/如果拖动的是上限if(m_nIsDraging=DT_UP)m_nLimitLow)m_nLimitUp)/如果没有超界if(offset+m_nLimitUp)=m_nLimitUp+=offset;elsem_nLimitUp=m_nLimitLow;elsem_nLimitUp=255;else/如果没有超界if(offset+m_nLimitLow)=0)if(offset+m_nLimitLow)3&abs(x-m_nLimitLow)3)m_nIsDraging=DT_NULL;/如果鼠标在直方图区域中if(rect.PtInRect(point)if(x=m_nLimitLow&x=m_nLimitUp)m_nGray=x;m_dPer=float(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年大学大四(制药工程)药厂车间布局设计试题及答案
- 2025年中职计算机与网络技术(办公软件应用)试题及答案
- 2025年中职石油加工工艺学(工艺应用)试题及答案
- 2025年高职矿山机械(矿山机械技术)试题及答案
- 2025年中职(工程造价)工程预算编制基础阶段测试题及解析
- 2025年中职第一学年(计算机应用)数据库基础实操试题及答案
- 2025年大学幼儿发展与健康管理(幼儿安全管理)试题及答案
- 2026年安徽粮食工程职业学院单招综合素质笔试模拟试题带答案解析
- 2026年湖北中医药高等专科学校高职单招职业适应性测试参考题库有答案解析
- 2026年呼伦贝尔职业技术学院单招综合素质笔试模拟试题带答案解析
- 2025年中国铁路昆明局集团有限公司招聘笔试参考题库含答案解析
- 广东省广州市海珠区2024-2025学年九年级上学期期末考试英语试题(含答案)
- 脊髓血管解剖及脊髓血管疾病基础
- 语文-2025年1月广西高三调研考全科试卷和答案(12地级市)
- GB/T 15972.40-2024光纤试验方法规范第40部分:传输特性的测量方法和试验程序衰减
- 陕西能源职业技术学院招聘笔试真题2023
- 施工机械设备施工技术方案
- 人教版六年级上册数学解方程练习100道及答案
- DL∕T 2447-2021 水电站防水淹厂房安全检查技术规程
- 必修一实验复习+期末复习 高一上学期物理人教版(2019)必修第一册
- 人工费合同简易版
评论
0/150
提交评论