《VC++数字图像处理源程序及详解之2(灰度线性变换).pdf》由会员分享,可在线阅读,更多相关《VC++数字图像处理源程序及详解之2(灰度线性变换).pdf(8页珍藏版)》请在三一文库上搜索。
1、9.2 灰度线性变换 灰度线性变换是最常用的点运算操作之一,下面先介绍其基本原理。 9.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)当 01 时刚刚相反,图像的对比度和整体效果都被削弱。从图9-10 中 的直方图可以看到,灰度分布被集中在一段区域上
4、。k 越小,图像的灰度分布越 窄,图像看起来也就越偏灰色。 图 9-10 利用线性变换改变图像对比度 4)当k 255) dTemp = 255; / 四舍五入 mapi = int(dTemp + 0.5); / 线性变换后的值直接在映射表中查找 for (UINT i = 0; i width * height; i+) for (int j = 0; j 4; j+) tempPixeli*4+j = map pixeli*4+j ; 该函数使用了灰度映射表的方式加快处理速度。点运算一般的处理方式是将每 个点都经过变换函数计算, 然后获得运算后的值, 故一幅图像大小为的图像至少 要运算
5、mn次。而 8 位灰度图的灰度取值范围是 0255,也就是说 256种取值只 对应于 256 种变换结果。可见第一种方法对灰度值相同的像素进行了重复运算, 效率不高。该函数将所有灰度取值都提前进行变换运算,并将结果保存在一个 大小为 256 的数组中,这样,输入灰度值与运算后的值之间就建立了一一映射关 系,通过映射表就能够直接获取变换后的结果。这种方法对于任意图像都只进 行 256 次运算,大大提高了效率。 2线性变换对话框 本节利用线性变换对话框实现灰度的线性变换,效果 如图 9-12 所示。该对话框 能够通过设置斜率和截距改变图像,同时提供预览框显示当前变换函数的图形。 打开 MagicH
6、ouse项目文件,调出“资源视图”窗口,添加 ID 为 IDD_LINETRAN 的对话框资源,整个对话框资源的设计如图9-12 所示。创建对话框类 CLineTranDlg 并按照表 9-2 关联对应变量。 图 9-12 线性变换对话框的设计 表 9-2 线性变换对话框资源与变量的关系 编号资 源 类 型 资源 ID 关联变量类 型 关联变量名称 1 图片控件IDC_PREV CStatic m_stiHistogram 2 文本框IDC_SLOPE double m_dSlope 3 文本框IDC_INTERCEPT double m_dIntercept 3实例代码清单 下面列出 Lin
7、eTranDlg.h的代码清单: #pragma once / CLineTranDlg 对话框 #include “PreviewDlg.h“ #include “afxwin.h“ class CLineTranDlg : public CDialog DECLARE_MESSAGE_MAP() DECLARE_DYNAMIC(CLineTranDlg) public: CStatic m_stiPrev; / 变换函 数预览框 double m_dSlope; / 斜率 double m_dIntercept; / 截距 / 标准构造析构函数 CLineTranDlg(CWnd* pPa
8、rent = NULL); virtual CLineTranDlg(); void Refresh(); / 刷新 预览框 virtual BOOL OnInitDialog(); / 对话框初始 化时显示预览对话框 afx_msg void OnEnChangeSlope(); / 改变斜率时的响应函数 afx_msg void OnEnChangeIntercept(); / 改变截距时的响应函数 afx_msg void OnBnClickedSave(); / “保存”按钮响应函数 afx_msg void OnBnClickedOk(); / “确定”按钮的响应 函数 afx_ms
9、g 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();
链接地址:https://www.31doc.com/p-5012251.html