《VC++数字图像处理源程序及详解之2(灰度线性变换).pdf》由会员分享,可在线阅读,更多相关《VC++数字图像处理源程序及详解之2(灰度线性变换).pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、9.29.2 灰度线性变换灰度线性变换 灰度线性变换是最常用的点运算 操作之一,下面先介绍其基本原理。9.2.19.2.1 基本原理基本原理 灰度线性变换是灰度变换的一种,图像的灰度变换通过建立灰度映射来调整源图像的灰度从而达到图像增强的目的。灰度映射通常是用灰度变换曲线来表示的,如图 9-7 所示。灰度线性变换就是将图像的像素值通过指定的线性函 数进行变换,以此增强或者减弱图像的灰度。灰度线性变换的公式就是常见的一维线性函数:g(x,y)=kf(x,y)+d 设x为原始灰度值,则变换后的灰度 值y为:也可以在坐标系中表示转化关系,如图 9-7 所示。图 9-7 灰度线性变换 图 9-7 坐标
2、中的横轴表示输入灰度值,范围是 0 至 255;纵坐标表示输出灰度值,范围同样是 0 至 255;直线则为线性变换函数的图形。如果将输入灰度值作为自变量 x,则输出的灰度值就是函数y=T(x)的运算结果。对于线性变换而言,有T(x)=kx+d。例如图 9-7 中的变换函数为T(x)=x,即原公式中的k=1,d=0。由数学知识可以知道k表示直线的斜 率,也就是倾斜程度;d为线性函数在y轴的斜率。下面通过讨论k的取值来分析灰度线性变换的效果。1)当k1 时 此时可用 于增加图像的对比度。图像的像素值在变换后全部增大,整体显示效果被增强,如图 9-8 所示。图 9-8 变换后的图像、对应变换函数和直
3、方图 可以看 到,图像经过变换后,其灰度分布被拉伸了。读者可以与图 9-1 中的直方图进行比较。2)当k=1 时 这种情况 常用于调节图像亮度。在第 6 章中已经介绍过了,亮度的调节就是让图像的各像素值都增加或者减少一定量。这种情况下可以通过改变d的值达到增 加或者减少图像亮度的目的,如图 9-9 所示。图 9-9 利用线性变换改变图像亮度 可以看 到,当d0 时图像亮度增加,反之则减少。对应直方图的显示效果是灰度分布整体向右或者向左平移。3)当 0k1 时刚刚相反,图像的对比度和整体效果都被削弱。从图 9-10 中的直方图可以看到,灰度分布被集中在一段区域上。k越小,图像的灰度分布越 窄,图
4、像看起来也就越偏灰色。图 9-10 利用线性变换改变图像对比度 4)当k0 时 在这种情 况下,源图像较亮的区域变暗,而较暗的区域会变亮。此时可以使函数中的k=-1,d=255 让图像实现反色效果,如图 9-11 所示。图 9-11 利用线性变换让图像反色 9.2.29.2.2 编程实现编程实现 1 1线性变换函数线性变换函数 灰度线性变换的函数代码如下:/*作用:线性变换函数*参数:*pixel:原始像素数组*tempPixel:保存变换后的图像像素数组*width:原始图像宽度*height:原始图像高度*slope:线性函数的斜率*inter:线性函数的截距*备注:此函数对于彩色图同样适
5、用*/void LineTrans(BYTE*pixel,BYTE*tempPixel,UINT width,UINT height,double slope,double inter)/灰度映射表 BYTE map256;/保存运算后的临时值 double dTemp;for(int i=0;i 256;i+)/计算当前像素变换后的值 dTemp=slope*i+inter;/如果超界则修改其值 if(dTemp 255)dTemp=255;/四舍五入 mapi=int(dTemp+0.5);/线性变换后的值直接在映射表中查找 for(UINT i=0;i width*height;i+)f
6、or(int j=0;j 4;j+)tempPixeli*4+j=map pixeli*4+j;该函数使用了灰度映射表的方式加快处理速度。点运 算一般的处理方式是将每个点都经过变换函数计算,然后获得运算后的值,故一幅图像大小为的图像至少要运算mn次。而 8 位灰度图的灰度取值范围是 0255,也就是说 256 种取值只对应于 256 种变换结果。可见第一种方法对灰度值相同的像素进行了重复运算,效率不高。该 函数将所有灰度取值都提前进行变换运算,并将结果保存在一个大小为 256 的数组中,这样,输入灰度值与运算后的值之间就建立了一一映射关系,通过映射表就 能够直接获取变换后的结果。这种方法对于任
7、意图像都只进行 256 次运算,大大提高了效率。2 2线性变换对话框线性变换对话框 本节利用线性变换对话框实现灰度的线性变换,效果 如图 9-12 所示。该对话框能够通过设置斜率和截距改变图像,同时提供预览框显示当前变换函数的图形。打开 MagicHouse 项目文件,调出“资源视 图”窗口,添加 ID 为 IDD_LINETRAN的对话框资源,整个对话框资源的设计如图 9-12 所示。创建对话框类CLineTranDlg 并按照表 9-2 关联对应变量。图 9-12 线性变换对话框的设计 表 9-2 线性变换对话框资源与变量的关系 编 号 资 源 类 型 资源 ID 关联变量类型 关联变量名
8、称 1 图片控件 IDC_PREV CStatic m_stiHistogram 2 文本框 IDC_SLOPE double m_dSlope 3 文本框 IDC_INTERCEPT double m_dIntercept 3 3实例代码清单实例代码清单 下面列出 LineTranDlg.h 的代码清 单:#pragma once/CLineTranDlg 对话框#include PreviewDlg.h#include afxwin.h class CLineTranDlg:public CDialog DECLARE_MESSAGE_MAP()DECLARE_DYNAMIC(CLineT
9、ranDlg)public:CStatic m_stiPrev;/变换函数预览框 double m_dSlope;/斜率 double m_dIntercept;/截距 /标准构造析构函数 CLineTranDlg(CWnd*pParent=NULL);virtual CLineTranDlg();void Refresh();/刷新预览框 virtual BOOL OnInitDialog();/对话框初始化时显示预览对话框 afx_msg void OnEnChangeSlope();/改变斜率时的响应函数 afx_msg void OnEnChangeIntercept();/改变截距时
10、的响应函数 afx_msg void OnBnClickedSave();/“保存”按钮响应函数 afx_msg void OnBnClickedOk();/“确定”按钮的响应函数 afx_msg void OnPaint();/对话框重绘函数 protected:virtual void DoDataExchange(CDataExchange*pDX);/DDX/DDV 支持 private:CPreviewDlg*dlg;/预览对话框 Bool m_bModify;/图像是否被修改 /对话框数据 enum IDD=IDD_LINETRAN;LineTranDlg.cpp 的实现代码请到指定网站下 载。4使用该对话框 打开“资源视图”,在“点运算”菜单中添加一个新 栏,如图 9-13 所示,将其Caption 属性设为“灰度线性变换”,其 ID 为 ID_POINT_LINETRAN。图 9-13 在菜单资源中添加新项 为其添加命令响应函数,具体内容如下:void CMagicHouseView:OnPointLinetran()if(!m_bIsEditMode|m_nPos=-1)MessageBox(L请先打开图像文件,然后选择编辑模式!);return;CLineTranDlg dlg;ResetImage();dlg.DoModal();