数字图像处理 订阅
数字图像处理(Digital Image Processing)是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。 [1]  数字图像处理的产生和迅速发展主要受三个因素的影响:一是计算机的发展;二是数学的发展(特别是离散数学理论的创立和完善);三是广泛的农牧业、林业、环境、军事、工业和医学等方面的应用需求的增长。 [2] 展开全文
数字图像处理(Digital Image Processing)是通过计算机对图像进行去除噪声、增强、复原、分割、提取特征等处理的方法和技术。 [1]  数字图像处理的产生和迅速发展主要受三个因素的影响:一是计算机的发展;二是数学的发展(特别是离散数学理论的创立和完善);三是广泛的农牧业、林业、环境、军事、工业和医学等方面的应用需求的增长。 [2]
信息
外文名
Digital Image Processing
应用学科
通信、多媒体
中文名
数字图像处理
数字图像处理简介
数字图像处理(Digital Image Processing)又称为计算机图像处理,它是指将图像信号转换成数字信号并利用 计算机对其进行处理的过程。
收起全文
精华内容
参与话题
问答
  • 数字图像处理.pdf

    2019-06-03 23:52:14
    数字图像处理MATLAB版本科教学版 第2版 [(美)冈萨雷斯,(美)伍兹,(美)艾丁斯 著] 2014年版
  • 数字图像处理复习总结

    万次阅读 多人点赞 2019-01-03 22:19:26
    复习着感觉记不住,于是乎,有了这篇博文,如果也同样选修了数字图像处理课程的小伙伴们可以参考一哈! 纯手码字…逢考必过! 概念 采样与量化 灰度变换缓慢的景物:粗采样、细量化 有大量细节变化的图像:...

    复习着感觉记不住,于是乎,有了这篇博文,如果也同样选修了数字图像处理课程的小伙伴们可以参考一哈! 纯手码字…逢考必过!

    概念

    采样与量化

    • 灰度变换缓慢的景物:粗采样、细量化
    • 有大量细节变化的图像:细采样、粗量化
      采样不够出现马赛克;量化不够出现假轮廓

    锐化:突出灰度的过渡部分(增强图像的细节边缘和轮廓,有利于图像的处理)

    • 方法:微分法高通滤波
    • 微分法包括梯度算子法拉普拉斯算子法;高通滤波包含空域高通滤波频域高通滤波

    平滑:用于模糊处理和降低噪声

    • 例:低通滤波、均值滤波、中值滤波(属于局部处理)

    平滑和锐化
    区别:图像锐化用于增强图像边缘,导致高频分量增强,会使图像清晰;图像平滑用于消除图像噪声,但也容易引起边缘的模糊
    联系:都属于图像增强,改善图像效果

    图像增强:通过某种技术有选择的突出对某一具体应用有用的信息,削弱或抑制一些无用的信息

    • 基于图像的灰度直方图,根据所在空间不同,分为空域和频域两种
    • 常用的彩色增强有:真彩色增强技术、假彩色增强技术、伪彩色增强技术

    一阶微分:用梯度算子来计算

    • 特点:对于亮的边,边的变化起点是正的,结束是负的;对于暗的边,结论相反;常数部分为0
    • 用途:用于检测图像中边的存在
      在这里插入图片描述

    二阶微分:用拉普拉斯算子来计算

    • 特点:二阶微分在亮的一边是负的,在暗的一边是正的。常数部分为0
    • 用途:
      • 二次导数的符号,用于确定边上像素是亮的一边还是暗的一边。
      • 0跨越,确定边的准确位置

    一阶微分算子和二阶微分算子在提取图像细节信息时有何不同?
    一阶微分算子产生较粗的边缘,二阶微分算子处理对细节有较强的响应,如细线和孤立点。二阶微分有一个过度,即从正回到负。在一幅图像中,该现象表现为双线。

    点处理

    • 例:二值化

    灰度方差:说明图像对比度(方差小,对比度小;方差大,对比度大)

    直方图均衡化:对在图像中像素的个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减,从而达到清晰图像的目的。

    图像分割的结果图像为二值图像,所以通常又称为图像分割为图像的二值化处理

    腐蚀是一种消除连通域边界点,使边界向内收缩的处理
    膨胀是将与目标区域背景点合并到该目标物中,使目标物边界向外部扩张的处理

    只存在噪声的复原——空间滤波

    均值滤波器:

    • 算术均值滤波器(最简单的均值滤波器)
    • 几何均值滤波器(几何均值滤波器比算术减少了对图像的模糊)
    • 谐波均值滤波器(对于"盐"噪声较好,但不适用于"胡椒"噪声;善于处理高斯噪声)
    • 逆谐波均值滤波器

    统计排序滤波器:

    • 中值滤波器(过度重复使用可能会对图像造成模糊)
    • 最大值和最小值滤波器(对于胡椒噪声(暗,值非常低),用最大值滤波器,发现图像中最亮点非常有用;对于盐粒噪声,用最小值滤波器,发现图像中最暗点非常有用)
    • 中点滤波器
    • 修正后的阿尔法均值滤波器

    由于脉冲噪声(椒盐噪声)的存在,算术均值滤波器和几何均值滤波器没有起到良好作用;中值滤波器和阿尔法滤波器效果更好,阿尔法最好。


    共点直线群Hough变换是一条正弦曲线

    边缘检测是将边缘像元识别出来的一种图像分割技术
    细化:提取线宽为一个像元大小的中心线操作

    图像复原的关键是建立退化模型,原图像f(x,y)是通过一个系统H及加入加性噪声n(x,y)而退化成一幅图像g(x,y)的,g(x,y)=H[f(x,y)]+n(x,y)g ( x , y ) = H [ f ( x , y ) ] + n ( x , y )

    几种噪声的运用

    • 高斯噪声源于电子电路噪声和由低照明度或高温带来的传感器噪声
    • 瑞利噪声对分布在图像范围内特征化噪声有用
    • 伽马分布和指数分布用于激光成像噪声
    • 均匀密度分布作为模拟随机数产生器的基础
    • 脉冲噪声用于成像中的短暂停留中,如错误的开关

    维纳滤波(最小均方误差)通常用于复原图像,在对图像复原过程中要计算噪声功率谱图像功率谱

    彩色图像增强时,加权均值滤波处理可以采用RGB彩色模型

    马赫带效应是指图像不同灰度级条带之间在灰度交界处存在毛边现象

    采用幂次变换进行图像灰度变换时,若图像偏亮,那么幂次取大于1,使得处理后图像变暗;若图像偏暗,那么幂次取小于1,使得处理后图像变亮;

    高通滤波后的图像通常较暗,为改善这种情况,将高通滤波器的转移函数加上一常量以便引入一些低频分量。这样的滤波器叫做高频提升滤波器

    边缘检测算子中,抗噪性能最好的是Prewitt算子

    链码:1)对于起点不一样导致结果不同,采用起点均一化,2)对于角度位置等不同导致的结果不一,采用差分(当前点值减去前一个值作为结果)


    简答

    当白天进入一个黑暗剧场时,在能看清并找到空座位时需要一段时间的适应,试述发生这种现象的视觉原理?
    人的视觉绝对不能同时在整个亮度适应范围工作,它是利用改变其亮度适应级来完成亮度适应的,即所谓的亮度适应范围。同整个亮度适应范围相比,能同时鉴别的光强度级的总范围很小。因此,白天进入黑暗剧场时,人的视觉系统需要改变亮度适应级,因此,需要一段时间,亮度适应级才能被改变。


    图像锐化滤波的几种方法
    1.直接以梯度值代替
    2.辅以门限判断
    3.给边缘规定一个特定的灰度级
    4.给背景规定灰度级
    5.根据梯度二值化图像


    什么是马赫带效应,如何利用这一效应对图像处理?
    原理:指图像不同灰度级条带之间在灰度交界处产生的毛边现象,使图像对比度加大,增加相邻灰度级的灰度差
    增加灰度级、灰度差,达到锐化效果


    伪彩色增强和假彩色增强有何异同?
    伪彩色增强是对一幅灰度图像经过三种变换得到三幅图像,进行彩色合成得到一幅彩色图像;
    假彩色增强则是对一幅彩色图像进行处理得到与原图像不同的彩色图像;

    • 主要差异:处理对象不同
    • 相同点:利用人眼对彩色的分辨能力高于灰度分辨能力的特点,将目标用人眼敏感的颜色表示

    什么是中值滤波,有何特点?
    中值滤波是指将当前像元的窗口(或频域)中所有像元灰度由小到大排序,中间值作为当前像元的输出值
    特点:是一种非线性的图像平滑法,它对脉冲干扰级椒盐噪声的抑制效果好,在抑制随机噪声的同时能有效保护边缘少受模糊

    对于椒盐噪声,为什么中值滤波效果比均值滤波效果好?
    椒盐噪声是复制近似相等但随机分布在不同的位置上,图像中有干净点也有污染点。中值滤波是选择适当的点来代替污染点的值,所以处理效果好。因为噪声的均值不为0,所以均值滤波不能很好地去除噪声


    什么是直方图均衡化?
    将原图像的直方图通过变换函数修正为均匀的直方图,然后按均衡直方图修正原图像。图像均衡化处理后,图像的直方图是平直的,即各灰度级具有相同的出现频数,那么由于灰度级具有均匀的概率分布,图像看起来就更清晰了


    图像增强的目的是什么?(灰度变换、直方图修正、图像锐化、图像平滑)
    图像增强的目的是为了改善图像的视觉效果,针对给定图像的应用场合,有目的地强调图像的整体或局部特性,将原来不清晰的图像变得清晰或强调某些感兴趣的特征,扩大图像中不同物体特征之间的差别,抑制不感兴趣的特征,使之改善图像质量、丰富信息量,加强图像判读和识别效果,满足某些特殊分析的需要。
    图像增强时,平滑和锐化具有哪些实现方法?
    平滑:领域平均法(均值滤波)中值滤波多图像平均法频域低通滤波法
    锐化:微分法高通滤波法


    简述梯度法与 Laplacian 算子检测边缘的异同点?
    答:梯度算子和 Laplacian 检测边缘对应的模板分别为
    在这里插入图片描述
    梯度算子是利用阶跃边缘灰度变化的一阶导数特性,认为极大值点对应于边缘点;而 Laplacian 算子检测边缘是利用阶跃边缘灰度变化的二阶导数特性,认为边缘点是零交叉点。


    简述基于边缘检测的霍夫变换的原理?
    把直线上的点的坐标变换到过点的直线的系数域,通过利用共线和直线相交的关系,使直线的提取问题转化为计数问题


    计算题

    Sobel算子
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    直方图均衡化(离散情况、连续情况),下面这题为离散情况的

    下面这题为连续情况:
    在这里插入图片描述


    理想低通滤波器的截止频率选择不恰当时,会有很强的振铃效应。试从原理上解释振铃效应的产生原因。

    答:理想低通滤波器(频域)的传递函数为:H(u,v)={1D(u,v)D00D(u,v)>D0H ( u , v ) = \left\{ \begin{array} { l l } { 1 } & { D ( u , v ) \leq D _ { 0 } } \\ { 0 } & { D ( u , v ) > D _ { 0 } } \end{array} \right.

    滤波器半径交叉部分(侧面图):

    对应空间域(进行傅立叶反变换,为sinc函数):

    用理想低通滤波器滤波时,频域:G(u,v)=F(u,v)H(u,v)G ( u , v ) = F ( u , v ) H ( u , v )

    傅立叶反变换到时域有:g(x,y)=f(x,y)h(x,y)g ( x , y ) = f ( x , y ) * h ( x , y )

    频域相乘相当于时域作卷积。因此,图像经过理想低通滤波器后,时域上相当于原始图像与sinc函数卷积,由于sinc函数振荡,则卷积后图像也会振荡;或者说由于sinc函数有两个负边带,卷积后图像信号两侧出现“过冲现象”,而且能量不集中,即产生振铃效应。若截止频率越低,即D0越小,则sinc函数主瓣越大,表现为中心环越宽,相应周围环(旁瓣)越大。而中心环主要决定模糊,旁瓣主要决定振铃效应。因此当截止频率较低时,会产生很强的振铃效应。选择适当的截止频率,会减小振铃效应

    PS:这里的时域也就是空间域


    逆滤波时,为什么在图像存在噪声时,不能采用全滤波?试采用逆滤波原理说明,并给出正确的处理方法。

    复原由退化函数退化的图像最直接的方法是直接逆滤波,在该方法中,用退化函数除退化图像的傅里叶变换来计算原始图像的傅里叶变换。

    F^(u,v)=G(u,v)H(u,v)=F(u,v)+N(u,v)H(u,v)\hat { F } ( u , v ) = \frac { G ( u , v ) } { H ( u , v ) }= F(u,v) + \frac { N(u,v) } { H(u,v)}

    上式说明即使知道退化函数,也不能准确地复原未退化的图像。因为噪声是一个随机函数,其傅氏变换未知。并且,实际应用逆滤波复原方法时存在病态的问题,即如果退化为零或非常小的值,则N(u,v)/H(u,v)之比很容易决定复原函数的值。

    实验证明,当退化图像的噪声较小,即轻度降质时,采用逆滤波复原的方法可以获得较好的结果。通常,在离频率平面原点较远的地方数值较小或为零,因此图象复原在原点周围的有限区域内进行,即将退化图象的傅立叶谱限制在没出现零点而且数值又不是太小的有限范围内。

    也就是说,解决退化函数为零或为非常小的值的问题的一种方法是,限制滤波的频率,使其接近原点。

    逢考必过!锦鲤附体!逢考必过!锦鲤附体!逢考必过!锦鲤附体! 重要的事情说三遍!

    展开全文
  • 数字图像处理 冈萨雷斯 第三版 中文版

    千次下载 热门讨论 2014-11-21 23:29:34
    数字图像处理领域 《数字图像处理 第三版 》作为主要教材已有30多年 这一版本是作者在前两版的基础上修订而成的 是前两版的发展与延续 除保留了前两版的大部分内容外 根据读者的反馈 作者在13个方面对《数字图像...
  • 数字图像处理》- 入门概念

    万次阅读 2019-05-12 19:37:12
    文章目录一、数字图像处理的概念 一、数字图像处理的概念 图像:图像可以定义为一个二维函数f(x,y),其中x和y是空间坐标,而f在任意坐标(x,y)处的幅度称为图像在该点处的亮度或者灰度。 数字图像:指图像f(x,y)...

    一、数字图像处理的概念

    1. 图像:图像可以定义为一个二维函数f(x,y),其中x和y是空间坐标,而f在任意坐标(x,y)处的幅度称为图像在该点处的亮度(图像的明亮程度)或者灰度
    2. 数字图像:指图像f(x,y)在空间坐标和亮度的数字化,数字图像由有限的元素组成,每一个元素都有一个特定的位置和幅值,这些元素称为图片元素、图像元素或像素
    3. 数字图像处理:是指借用数字计算机处理数字图像,既包括输入输出都是图像的处理,也包括从图像中提取特征的过程。
    4. 灰度图像可以看成一个矩阵,也可以看成一个二维离散函数

    二、认识 MATLAB

    MATLAB桌面是MATLAB的主要工作环境,它是针对诸如运行MATLAB命令、观察输出、编辑和管理文件与变量、观察回话历史等任务的一个图形工具集。

    1. 命令窗口:输入MATLAB命令的地方,可以调用MATLAB函数,或者给变量赋值

    2. 常用命令:
      clear:从工作空间删除所有变量
      clc:清除命令窗口的内容
      edit:打开编辑器

    3. 获取帮助在这里插入图片描述
      需要注意的是需要注册账户才可以使用MATLAB的帮助文档。
      在这里插入图片描述

    三、数字图像的表示

    1. 彩色图像:是由多幅单色图像组合而成,比如在RGB彩色系统中,一副彩色图像是由三幅单色图像组成的,这三幅图像分别称为
      红®、绿(G)、蓝(B)原色图像

    2. 图像关于x坐标、y坐标和幅度是连续的,将这样的一幅图像转换成数字形式,要求对坐标和幅度进行数字化。将坐标值数字化称为采样,将幅值数字化称为量化,因此当x,y和幅值f都是有限的、离散的量时,我们称该图像为数字图像
      其他解释:
      对于一幅图像,我们可以将其放入坐标系中,这里取图像左上定点为坐标原点,x 轴向右,和笛卡尔坐标系x轴相同;y 轴向下,和笛卡尔坐标系y轴相反。这样我们可将一幅图像定义为一个二维函数 f(x,y),图像中的每个像素就可以用 (x,y) 坐标表示,而在任何一对空间坐标 (x,y) 处的幅值 f 称为图像在该点的强度或灰度,当 x,y 和灰度值 f 是有限离散数值时,便称该图像为 数字图像

    3. 坐标约定:采样和量化得到的是一个实数矩阵
      (1)多数图像处理书籍中使用的坐标约定: 假设对一幅图像f(x,y)采样后得到一个M行、N列的图像,称这幅图像的大小为M x N,离散的坐标都取整数值,坐标原点在(0,0)处,其中x的范围(0 ~ M-1),y的范围(0 ~ N-1)
      在这里插入图片描述
      灰度图像可以看成一个矩阵,也可以看成一个二维离散函数

      (2)图像处理工具箱中所用的坐标约定:使用(r,c)来表示行和列,坐标原点在(1,1)处,其中r的范围(1 ~ M),c的范围(1 ~ N)
      在这里插入图片描述

    (3)空间坐标的坐标约定:不太常用,以x表示列,y表示行

    1. 图像的矩阵表示
      提示:矩阵是二维的,阵列可以是任意有限维
      在这里插入图片描述
      等式的右边定义的是一幅数字图像,这个阵列的每个元素都称为图像元素、图画元素或者像素每一个元素都有一个位置和幅值
      例如:
      在这里插入图片描述
      其中f(1,1)等于f(0,0),符号f(p,q)表示第p行和第q列的元素
      一个1 x N 的矩阵称为一个行向量,一个M x 1 的矩阵称为一个列向量,一个1x1的矩阵被称为标量

    2. MATLAB中的矩阵存储在名如A、a、RGB等的变量中,变量必须以字母开头,只能有数字、字母和下划线组成

    展开全文
  • 数字图像处理 【第3版】-完整高清
  • 1.理解二维傅里叶变换的定义 ...一个图像尺寸为M×N的 函数的离散傅里叶变换由以下等式给出: 其中 和。其中变量u和v用于确定它们的频率,频域系统是由所张成的坐标系,其中和用做(频率)变量...

    from:https://www.cnblogs.com/tenderwx/p/5245859.html

    1.理解二维傅里叶变换的定义

    1.1二维傅里叶变换

    二维Fourier变换:

    逆变换:

    1.2二维离散傅里叶变换

    一个图像尺寸为M×N的 函数的离散傅里叶变换由以下等式给出:


    其中 和。其中变量u和v用于确定它们的频率,频域系统是由所张成的坐标系,其中和用做(频率)变量。空间域是由f(x,y)所张成的坐标系。可以得到频谱系统在频谱图四角处沿和方向的频谱分量均为0。

    离散傅里叶逆变换由下式给出:

    令R和I分别表示F的实部和需部,则傅里叶频谱,相位角,功率谱(幅度)定义如下:


    1.3用FFT计算二维离散傅里叶变换

    二维离散傅里叶变换的定义为:

        

    二维离散傅里叶变换可通过两次一维离散傅里叶变换来实现:

    1)作一维N点DFT(对每个m做一次,共M次)

    2)作M点的DFT(对每个k做一次,共N次)


    这两次离散傅里叶变换都可以用快速算法求得,若M和N都是2的幂,则可使用基二FFT算法,所需要乘法次数为                                    

     

    而直接计算二维离散傅里叶变换所需的乘法次数为(M+N)MN,当M和N比较大时用用FFT运算,可节约很多运算量。

    1.3图像傅里叶变换的物理意义

    图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率值较高。傅里叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,则其傅里叶变换就表示f的频谱。从纯粹的数学意义上看,傅里叶变换是将一个函数转换为一系列周期函数来处理的。从物理效果看,傅里叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅里叶变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数。

    傅里叶逆变换是将图像的频率分布函数变换为灰度分布函数傅里叶变换以前,图像(未压缩的位图)是由对在连续空间(现实空间)上的采样得到一系列点的集合,通常用一个二维矩阵表示空间上各点,记为z=f(x,y)。又因空间是三维的,图像是二维的,因此空间中物体在另一个维度上的关系就必须由梯度来表示,这样我们才能通过观察图像得知物体在三维空间中的对应关系。

    傅里叶频谱图上我们看到的明暗不一的亮点,其意义是指图像上某一点与邻域点差异的强弱,即梯度的大小,也即该点的频率的大小(可以这么理解,图像中的低频部分指低梯度的点,高频部分相反)。一般来讲,梯度大则该点的亮度强,否则该点亮度弱。这样通过观察傅里叶变换后的频谱图,也叫功率图,我们就可以直观地看出图像的能量分布:如果频谱图中暗的点数更多,那么实际图像是比较柔和的(因为各点与邻域差异都不大,梯度相对较小);反之,如果频谱图中亮的点数多,那么实际图像一定是尖锐的、边界分明且边界两边像素差异较大的。

    对频谱移频到原点以后,可以看出图像的频率分布是以原点为圆心,对称分布的。将频谱移频到圆心除了可以清晰地看出图像频率分布以外,还有一个好处,它可以分离出有周期性规律的干扰信号,比如正弦干扰。一幅频谱图如果带有正弦干扰,移频到原点上就可以看出,除了中心以外还存在以另一点为中心、对称分布的亮点集合,这个集合就是干扰噪音产生的。这时可以很直观的通过在该位置放置带阻滤波器消除干扰。

    2.二维傅里叶变换有哪些性质?

    2.1二维离散傅里叶变换的性质

    1)分离性

    二维离散傅里叶变换具有分离性

      

    分离性质的主要优点是可借助一系列一维傅里叶变换分两步求得。第1步,沿着的每一行取变换,将其结果乘以1/N,取得二维函数;第2步,沿着的每一列取变换,再将结果乘以1/N,就得到了。这种方法是先行后列。如果采用先列后行的顺序,其结果相同。

    如图:


     

    对逆变换f(x,y)也可以类似地分两步进行。

    2)平移性

    傅里叶变换和逆变换对的位移性质是指:

     

    由乘以指数项并取其乘积的傅立叶变换,使频率平面的原点位移至。同样地,以指数项乘以并取其反变换,将空间域平面的原点位移至当N/2时,指数项为:

    即为

    这样,用(x+y)乘以就可以将的傅里叶变换原点移动到N*N频率方阵的中心,这样才能看到整个谱图。另外,对的平移不影响其傅里叶变换的幅值。

    此外,与连续二维傅里叶变换一样,二维离散傅里叶变换也具有周期性共轭对称性、线性、旋转性、相关定理、卷积定理、比例性等性质。这些性质在分析及处理图像时有重要意义。

    2.2二维离散傅里叶变换图像性质

    1、图像经过二维傅里叶变换后,其变换系数矩阵具有如下性质:若变换矩阵原点设在中心,其频谱能量集中分布在变换系数短阵的中心附近(图中阴影区)。若所用的二维傅里叶变换矩阵的原点设在左上角,那么图像信号能量将集中在系数矩阵的四个角上。这是由二维傅里叶变换本身性质决定的。同时也表明一股图像能量集中低频区域。

    2、图像灰度变化缓慢的区域,对应它变换后的低频分量部分;图像灰度呈阶跃变化的区域,对应变换后的高频分量部分。除颗粒噪音外,图像细节的边缘、轮廓处都是灰度变化突变区域,它们都具有变换后的高频分量特征。

     

    3.任给一幅图像,对其进行二维傅里叶变换和逆变换

    原图

    二维傅里叶变换

    逆变换

    频谱图

    原图

    加入高斯躁声

    加入椒盐躁声

     

    对高斯躁声中值滤波

    对椒盐躁声中值滤波

     

    对高斯躁声算术均值滤波

    对椒盐躁声算术均值滤波

     

    4.附录

    4.1matlab代码

    1)程序一

    复制代码

     1 [i,lcmp]=imread('F:/123.jpg');%=======读取图像 显示图像
     2 
     3 subplot(2,2,1),imshow(i,lcmp);
     4 
     5 title('original');
     6 
     7 ii=im2double(i); %=====将图像矩阵类型转换为double(图像计算很多是不能用整型的),没有这个会报错!! ,如果不用这个就必须转化为灰度图!
     8 
     9 i1 = fft2(ii); %======傅里叶变换
    10 
    11 i2 =fftshift(i1); %======将变换的频率图像四角移动到中心(原来良的部分在四角 现在移动中心,便于后面的处理)
    12 
    13 i3=log(abs(i2)); %=====显示中心低频部分,加对数是为了更好的显示
    14 
    15 subplot(2,2,2),imshow(i3,[]);
    16 
    17 title('Fourier');
    18 
    19 map=colormap(lcmp); %===取色谱
    20 
    21 imwrite(i3,map,'f:/ffttank.bmp'); %===将上面i3输入到ffttank文件中
    22 
    23 i5 = real(ifft2(ifftshift(i2))); %===频域的图反变换到空域 并取实部
    24 
    25 i6 = im2uint8(mat2gray(i5)); %===取其灰度图
    26 
    27 imwrite(i6,map,'f:/tank2.bmp','bmp'); %===利用灰度图和原来取得颜色模板 还原图像
    28 
    29 subplot(2,2,3),imshow(i6);
    30 
    31 title('anti-Fourier');
    32 
    33 i7=rgb2gray(i);
    34 
    35 i8=fft2(i7);%===对灰色图才能归一化。因为那是2维矩阵,彩色图是3维矩阵,需要转化为2维灰图
    36 
    37 m=fftshift(i8); %直流分量移到频谱中心
    38 
    39 %RR=real(m); %取傅立叶变换的实部
    40 
    41 %II=imag(m); %取傅立叶变换的虚部
    42 
    43 A=abs(m);%计算频谱幅值
    44 
    45 %A=sqrt(RR.^2+II.^2);
    46 
    47 A=(A-min(min(A)))/(max(max(A))-min(min(A)))*225; %归一化
    48 
    49 subplot(2,2,4),imshow(A); %显示原图像
    50 
    51 colorbar; %显示图像的颜色条
    52 
    53 title('FFT spectrum'); %图像命名
    54 
    55  

    复制代码

     

     

    2)程序二

    复制代码

     1 m=imread('F:/123.jpg');
     2 
     3 M=rgb2gray(m); %==滤波函数都是对二维灰度图,Tif可直接滤波
     4 
     5 subplot(3,3,1)
     6 
     7 imshow(M);%显示原始图像
     8 
     9 title('original')
    10 
    11 P1=imnoise(M,'gaussian',0.02); %加入高斯躁声
    12 
    13 subplot(3,3,2)
    14 
    15 imshow(P1) %加入高斯躁声后显示图像
    16 
    17 title('gaussian noise');
    18 
    19 P2=imnoise(M,'salt & pepper',0.02); %=加入椒盐躁声
    20 
    21 subplot(3,3,3)
    22 
    23 imshow(P2) %%加入椒盐躁声后显示图像
    24 
    25 title('salt & pepper noise');
    26 
    27 g=medfilt2(P1); %对高斯躁声中值滤波
    28 
    29 subplot(3,3,5)
    30 
    31 imshow(g)
    32 
    33 title('medfilter gaussian')
    34 
    35 h=medfilt2(P2); %对椒盐躁声中值滤波
    36 
    37 subplot(3,3,6)
    38 
    39 imshow(h)
    40 
    41 title('medfilter salt & pepper noise')
    42 
    43 l=[1 1 1 %对高斯躁声算术均值滤波
    44 
    45 1 1 1
    46 
    47 1 1 1];
    48 
    49 l=l/9;
    50 
    51 k=conv2(P1,l);
    52 
    53 subplot(3,3,8)
    54 
    55 imshow(k,[])
    56 
    57 title('arithmeticfilter gaussian')
    58 
    59 %对椒盐躁声算术均值滤波
    60 
    61 d=conv2(P2,l);
    62 
    63 subplot(3,3,9)
    64 
    65 imshow(d,[])
    66 
    67 title('arithmeticfilter salt & pepper noise')
    68 
    69  

    复制代码

     

    4.2参考文献

    [1]孟凡文, 吴禄慎.基于FTP的二维傅里叶变换的研究.激光与红外. 第38卷第9期 2008年9月       

    [2] 董健,邓国辉,李金武. 基于二维傅里叶变换实现图像变换的研究. 福建电脑. 2015年第 9期

    展开全文
  • 转自https://blog.csdn.net/eastmount/article/details/46312145本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片...

     转自https://blog.csdn.net/eastmount/article/details/46312145

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片点运算处理,包括图像灰度线性变换、灰度非线性变换、图像阈值化处理、图像均衡化处理等知识,并结合前一篇论文灰度直方图进行展示 。同时文章比较详细基础,希望该篇文章对你有所帮助,尤其是初学者和学习图像处理的学生。

           【数字图像处理】一.MFC详解显示BMP格式图片
           【数字图像处理】二.MFC单文档分割窗口显示图片
           【数字图像处理】三.MFC实现图像灰度、采样和量化功能详解
           【数字图像处理】四.MFC对话框绘制灰度直方图
            
    免费资源下载地址:
            http://download.csdn.net/detail/eastmount/8764373


    一. 点运算与初始操作

            图像的点运算是图像处理中非常基础的技术,它主要用于改变一篇图像的灰度分布范围,通过一定的变换函数将图像的像素进行转换,最终生成一幅新的图像。点运算的最大特点就是输出像素值只与当前输入像素值相关。定义如下。
            点运算(Point Operation)指对于一幅输入图像,将产生一幅输出图像,输出图像的每个像素点的灰度值由输入像素点决定。
            点运算由灰度变换函数(Grap Scale Transformation,GST)确定:B(x,y)=F[A(x,y)]

            需要注意一下几点:
            (1).与局部或邻域运算的差别,输入像素和输出像素是一一对应的;(2).与几何运算的差别,不改变图像的空间关系;(3).又称为对比增强,对比拉伸或灰度变换。


            在前面第四篇博客的基础上增加点运算处理。
            第一步:在资源视图中Menu中添加“图像点运算”菜单栏如下所示:


            对应的ID值为:
            线性变换 ID_DYS_XXYD(点运算 线性移动) ID_DYS_XXZQ( 点运算 线性增强)
                           ID_DYS_XXJX(点运算 线性减小)  ID_DYS_XXQB(点运算 线性求补)
            非线性变换 ID_DYS_FXXPF(点运算 非线性平方) ID_DYS_FXXHS(非线性函数)
            阈值变换 ID_DYS_YZBH(点运算 阈值变换) 图像均衡化 ID_DYS_JHH

            第二步:打开类向导(Ctrl+W),为点运算每个ID菜单添加相应的功能处理函数,如下图所示:选择类CImageProcessingView,在选择IDs为ID_DYS_...(点运算)添加函数OnDysXxqb()线性求补。


    二. 线性变换

            图像线性变换是通过建立灰度映射来调整资源图像的灰度,从而达到图像增强的目的。其中GST函数f(D)为线性的,即:


            若a=1,b=0图像像素不发生变化
            若a=1,b!=0图像所有灰度值上移或下移
            若a>1输出图像对比度增强
            若0<a<1输出图像对比度减小
            若a<0暗区域变亮,亮区域变暗,图像求补


            1.D(B)=D(A)+50
            首先是图像移动,代码如下:
    1. /**********************************************************************/  
    2. /* 图像点运算 4种线性变化直方图:                                                 
    3. /* ID_DYS_XXYD:表示线性灰度变化移动 D(B)=D(A)+50  灰度值上移下移         
    4. /* ID_DYS_XXZQ:表示线性灰度变化增强 D(B)=1.5*D(A) 图像对比度增强        
    5. /* ID_DYS_XXJX:表示线性灰度变化减小 D(B)=0.8*D(A) 图像对比度减小        
    6. /* ID_DYS_XXQB:表示线性灰度求补 D(B)=-1*D(A)+255  图像暗区变亮,亮区变暗  
    7. /**********************************************************************/  
    8.   
    9. // 1.点运算 线性灰度变化移动 D(B)=D(A)+50  
    10. void CImageProcessingView::OnDysXxyd()   
    11. {  
    12.     // TODO: Add your command handler code here  
    13.     if(numPicture==0) {  
    14.         AfxMessageBox("载入图片后才能线性灰度运算!",MB_OK,0);  
    15.         return;  
    16.     }  
    17.     AfxMessageBox("线性灰度直方图-灰度变化移动 D(B)=D(A)+50!",MB_OK,0);  
    18.     int i;  
    19.     //打开临时的图片  
    20.     FILE *fpo = fopen(BmpName,"rb");  
    21.     FILE *fpw = fopen(BmpNameLin,"wb+");  
    22.     //读取文件  
    23.     fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
    24.     fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    25.     fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);  
    26.     fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);  
    27.     //灰度图像  
    28.     unsigned char color;  
    29.     unsigned char red,green,blue;  
    30.     for( i=0; i<m_nImage/3; i++ )  
    31.     {  
    32.         fread(&red,sizeof(char),1,fpo);  
    33.         fread(&green,sizeof(char),1,fpo);  
    34.         fread(&blue,sizeof(char),1,fpo);  
    35.   
    36.         if( (int)red+50 >255 )  
    37.             red=255;  
    38.         else  
    39.             red=(int)red+50;  
    40.   
    41.         if( (int)green+50>255 )  
    42.             green=255;  
    43.         else  
    44.             green=(int)green+50;    
    45.   
    46.         if( (int)blue+50>255 )  
    47.             blue=255;  
    48.         else  
    49.             blue=(int)blue+50;  
    50.   
    51.         fwrite(&red,sizeof(char),1,fpw);  
    52.         fwrite(&green,sizeof(char),1,fpw);  
    53.         fwrite(&blue,sizeof(char),1,fpw);  
    54.     }  
    55.     fclose(fpo);  
    56.     fclose(fpw);  
    57.     numPicture = 2;  
    58.     level=101;       //赋值101在ShowBitmap中调用显示处理后的图片  
    59.     Invalidate();  
    60. }  

            同时修改void CImageProcessingView::ShowBitmap(CDC *pDC, 
    CString BmpName)函数中的代码:

    1. else        //图像点运算 线性变化  
    2. if(level=101)  
    3. {  
    4.     m_hBitmapChange = (HBITMAP) LoadImage(NULL,BmpNameLin,IMAGE_BITMAP,0,0,  
    5.         LR_LOADFROMFILE|LR_DEFAULTSIZE|LR_CREATEDIBSECTION);  
    6. }  
            运行效果如下图所示,同时我截取了直方图(RGB相同只显示一种)。

            可以发现图像的灰度上移了50,图像更白了(黑0-255白)。

            2.D(B)=1.5*D(A)
    1. // 2.点运算 线性灰度变化增强 D(B)=1.5*D(A)  
    2. void CImageProcessingView::OnDysXxzq()   
    3. {  
    4.     if(numPicture==0) {  
    5.         AfxMessageBox("载入图片后才能线性灰度运算!",MB_OK,0);  
    6.         return;  
    7.     }  
    8.     AfxMessageBox("线性灰度直方图-灰度变化增强 D(B)=1.5*D(A)!",MB_OK,0);  
    9.     int i;  
    10.     //打开临时的图片  
    11.     FILE *fpo = fopen(BmpName,"rb");  
    12.     FILE *fpw = fopen(BmpNameLin,"wb+");  
    13.     fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
    14.     fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    15.     fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);  
    16.     fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);  
    17.     //灰度图像  
    18.     unsigned char color;  
    19.     unsigned char red,green,blue;  
    20.     for( i=0; i<m_nImage/3; i++ )  
    21.     {  
    22.         fread(&red,sizeof(char),1,fpo);  
    23.         fread(&green,sizeof(char),1,fpo);  
    24.         fread(&blue,sizeof(char),1,fpo);  
    25.   
    26.         if( (int)red*1.5 >255 )  
    27.             red=255;  
    28.         else  
    29.             red=(int)red*1.5;  
    30.   
    31.         if( (int)green*1.5>255 )  
    32.             green=255;  
    33.         else  
    34.             green=(int)green*1.5;    
    35.           
    36.         if( (int)blue*1.5>255 )  
    37.             blue=255;  
    38.         else  
    39.             blue=(int)blue*1.5;  
    40.   
    41.         fwrite(&red,sizeof(char),1,fpw);  
    42.         fwrite(&green,sizeof(char),1,fpw);  
    43.         fwrite(&blue,sizeof(char),1,fpw);  
    44.     }  
    45.     fclose(fpo);  
    46.     fclose(fpw);  
    47.     numPicture = 2;  
    48.     level=101;      //线性变化 ShowBitmap中调用  
    49.     Invalidate();  
    50. }  
            运行效果如下图所示,图像对比度增强,平均灰度122*1.5=181

            3.D(B)=0.8*D(A)
    1. // 3.点运算 线性灰度变化减小D(B)=0.8*D(A)  
    2. void CImageProcessingView::OnDysXxjx()   
    3. {  
    4.     if(numPicture==0) {  
    5.         AfxMessageBox("载入图片后才能线性灰度处理!",MB_OK,0);  
    6.         return;  
    7.     }  
    8.     AfxMessageBox("线性灰度直方图-灰度减小 D(B)=0.8*D(A)!",MB_OK,0);  
    9.     int i;  
    10.     //打开临时的图片  
    11.     FILE *fpo = fopen(BmpName,"rb");  
    12.     FILE *fpw = fopen(BmpNameLin,"wb+");  
    13.     fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
    14.     fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    15.     fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);  
    16.     fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);  
    17.     //灰度图像  
    18.     unsigned char color;  
    19.     unsigned char red,green,blue;  
    20.     for( i=0; i<m_nImage/3; i++ )  
    21.     {  
    22.         fread(&red,sizeof(char),1,fpo);  
    23.         fread(&green,sizeof(char),1,fpo);  
    24.         fread(&blue,sizeof(char),1,fpo);  
    25.   
    26.         red=(int)red*0.8;  
    27.         green=(int)green*0.8;    
    28.         blue=(int)blue*0.8;  
    29.   
    30.         fwrite(&red,sizeof(char),1,fpw);  
    31.         fwrite(&green,sizeof(char),1,fpw);  
    32.         fwrite(&blue,sizeof(char),1,fpw);  
    33.     }  
    34.     fclose(fpo);  
    35.     fclose(fpw);  
    36.     numPicture = 2;  
    37.     level=101;  
    38.     Invalidate();  
    39. }  
            运行如下图所示,图像减弱。



            4.D(B)=-1*D(A)+255
    1. // 4.点运算 线性灰度求补 D(B)=-1*D(A)+255  
    2. void CImageProcessingView::OnDysXxqb()   
    3. {  
    4.     if(numPicture==0) {  
    5.         AfxMessageBox("载入图片后才能线性灰度处理!",MB_OK,0);  
    6.         return;  
    7.     }  
    8.     AfxMessageBox("线性灰度直方图-灰度求补 D(B)=-1*D(A)+255!",MB_OK,0);  
    9.     int i;  
    10.     //打开临时的图片  
    11.     FILE *fpo = fopen(BmpName,"rb");  
    12.     FILE *fpw = fopen(BmpNameLin,"wb+");  
    13.     fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
    14.     fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    15.     fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);  
    16.     fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);  
    17.     //灰度图像  
    18.     unsigned char color;  
    19.     unsigned char red,green,blue;  
    20.     for( i=0; i<m_nImage/3; i++ )  
    21.     {  
    22.         fread(&red,sizeof(char),1,fpo);  
    23.         fread(&green,sizeof(char),1,fpo);  
    24.         fread(&blue,sizeof(char),1,fpo);  
    25.   
    26.         red=(int)red*(-1)+255;  
    27.         green=(int)green*(-1)+255;    
    28.         blue=(int)blue*(-1)+255;  
    29.   
    30.         fwrite(&red,sizeof(char),1,fpw);  
    31.         fwrite(&green,sizeof(char),1,fpw);  
    32.         fwrite(&blue,sizeof(char),1,fpw);  
    33.     }  
    34.     fclose(fpo);  
    35.     fclose(fpw);  
    36.     numPicture = 2;  
    37.     level=101;  
    38.     Invalidate();  
    39. }  
            运行效果如下图所示,它是图像的求补,发现直方图是互补的。

            PS:注意图片下面的直方图应该还有一个处理后的直方图,但原理都一样,我不想重复工作,你自己可以去简单实现下,参考第四篇文章。同时这些图片制作还挺麻烦的,只是为了给你更好的呈现它们的变化,希望对你有用和尊重作者,不喜勿喷~

    三. 非线性变换

            灰度非线性变换主要包括对数变换、幂次变换、指数变换、分段函数变换,通过非线性关系对图像进行灰度处理,下面主要讲解课件中的两个函数对其进行处理。其中对数变换实现了扩展低灰度值而压缩高灰度值的效果,图像灰度分布更符合而你的视觉特征。


            1.D(B)=D(A)*D(A)/252
    1. /************************************************************************/  
    2. /* 2种非线性变化直方图:                                                 
    3. /* ID_DYS_FXXPF:表示非线性平方灰度变化,D(B)=D(A)*D(A)/255                 
    4. /* ID_DYS_FXXHS:表示非线性函数灰度变化,D(B)=D(A)+0.8*D(A)*(255-D(A))/255  
    5. /************************************************************************/  
    6.   
    7. // 非线性平方灰度变化 D(B)=D(A)*D(A)/252  
    8. void CImageProcessingView::OnDysFxxpf()   
    9. {  
    10.     if(numPicture==0)  
    11.     {  
    12.         AfxMessageBox("载入图片后才能非线性灰度处理!",MB_OK,0);  
    13.         return;  
    14.     }  
    15.     AfxMessageBox("非线性灰度变化 D(B)=D(A)*D(A)/255!",MB_OK,0);  
    16.     int i;  
    17.     //打开临时的图片  
    18.     FILE *fpo = fopen(BmpName,"rb");  
    19.     FILE *fpw = fopen(BmpNameLin,"wb+");  
    20.     //读取文件  
    21.     fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
    22.     fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    23.     fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);  
    24.     fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);  
    25.     //灰度图像  
    26.     unsigned char color;  
    27.     unsigned char red,green,blue;  
    28.     for( i=0; i<m_nImage/3; i++ )  
    29.     {  
    30.         fread(&red,sizeof(char),1,fpo);  
    31.         fread(&green,sizeof(char),1,fpo);  
    32.         fread(&blue,sizeof(char),1,fpo);  
    33.   
    34.         red=(int)red*(int)red/255;  
    35.         green=(int)green*(int)green/255;  
    36.         blue=(int)blue*(int)blue/255;  
    37.   
    38.         fwrite(&red,sizeof(char),1,fpw);  
    39.         fwrite(&green,sizeof(char),1,fpw);  
    40.         fwrite(&blue,sizeof(char),1,fpw);  
    41.     }  
    42.     fclose(fpo);  
    43.     fclose(fpw);  
    44.     numPicture = 2;  
    45.     level=101;  
    46.     Invalidate();  
    47. }  
            运行效果如下图所示:

            2.D(B)=D(A)+0.8*D(A)*(255-D(A))/255
    1. // 非线性函数灰度变化 D(B)=D(A)+0.8*D(A)*(255-D(A))/255  
    2. void CImageProcessingView::OnDysFxxhs()   
    3. {  
    4.     if(numPicture==0)  
    5.     {  
    6.         AfxMessageBox("载入图片后才能非线性灰度处理!",MB_OK,0);  
    7.         return;  
    8.     }  
    9.     AfxMessageBox("线性灰度直方图-灰度变化增强 D(B)=D(A)+0.8*D(A)*(255-D(A))/255!",MB_OK,0);  
    10.     int i;  
    11.   
    12.     FILE *fpo = fopen(BmpName,"rb");  
    13.     FILE *fpw = fopen(BmpNameLin,"wb+");  
    14.     fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
    15.     fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);   
    16.     fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);  
    17.     fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);  
    18.   
    19.     unsigned char color;  
    20.     unsigned char red,green,blue;  
    21.     for( i=0; i<m_nImage/3; i++ )  
    22.     {  
    23.         fread(&red,sizeof(char),1,fpo);  
    24.         fread(&green,sizeof(char),1,fpo);  
    25.         fread(&blue,sizeof(char),1,fpo);  
    26.   
    27.         if( ((int)red+0.8*(int)red*(255-(int)red)/255) > 255 )  
    28.             red=255;  
    29.         else  
    30.             red=(int)red+0.8*(int)red*(255-(int)red)/255;  
    31.   
    32.         if( ((int)green+0.8*(int)green*(255-(int)green)/255) > 255 )  
    33.             green=255;  
    34.         else  
    35.             green=(int)green+0.8*(int)green*(255-(int)green)/255;    
    36.           
    37.         if( ((int)blue+0.8*(int)blue*(255-(int)blue)/255) > 255 )  
    38.             blue=255;  
    39.         else  
    40.             blue=(int)blue+0.8*(int)blue*(255-(int)blue)/255;  
    41.   
    42.         fwrite(&red,sizeof(char),1,fpw);  
    43.         fwrite(&green,sizeof(char),1,fpw);  
    44.         fwrite(&blue,sizeof(char),1,fpw);  
    45.     }  
    46.     fclose(fpo);  
    47.     fclose(fpw);  
    48.     numPicture = 2;  
    49.     level=101;  
    50.     Invalidate();  
    51. }  
            运行效果如下图所示:


            写到此处你会发现图像灰度的线性变换和非线性变换是非常简单的,主要是通过以下步骤完成:
            第一步:赋值处理后图像的BMP头信息
                FILE *fpo = fopen(BmpName,"rb");
                FILE *fpw = fopen(BmpNameLin,"wb+");
                fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);
                fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);
                fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);
                fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);

            第二步:通过循环和线性变换或非线性便函函数处理每一个像素
                for( i=0; i<m_nImage/3; i++ )
                {
                     fread(&red,sizeof(char),1,fpo);
                     处理像素RBG 如:red=(int)red*(int)red/255;
                     fwrite(&red,sizeof(char),1,fpw);
                }

             第三步:调用ShowBitmap自定义函数并重绘图像
                numPicture = 2;
                level=101;
                Invalidate();
            
    而它的主要应用包括:光度学标定,希望数字图像的灰度能够真实反映图像的物理特性;对比度增强和对比度扩展;显示标定和轮廓线确定(阈值化)。

    四. 灰度阈值化

            阈值又称为临界值,它的目的是确定出一个范围,然后这个范围内的部分使用同一种方法处理,而阈值之外的部分则使用另一种处理方法或保持原样。常用的包括产生二值图:当x<T时y=0,当x>=T时y=255(其中T是阈值)。阈值变换在生物学上的应用比较广泛,常用语细胞图像分割等。
            打开类向导(Ctrl+W)生成选择ImageProcessingView类,IDs选择ID_DYS_YZBH后添加相应的函数。代码如下:

    1. /**************************************************************/  
    2. /* ID_DYS_YZBH:表示点运算阈值变换 也看做灰度拉伸                    
    3. /* 此处的拉伸是:阈值化(thresholding)可以看作是削波的一个特例  
    4. /* 只要令削波中的g1old=g2old就实现了阈值化。                   
    5. /* 阈值就象个门槛,比它大就是白,比它小就是黑,二值             
    6. /**************************************************************/  
    7.   
    8. void CImageProcessingView::OnDysYzbh()   
    9. {  
    10.     if(numPicture==0)  
    11.     {  
    12.         AfxMessageBox("载入图片后才能点运算阈值化处理!",MB_OK,0);  
    13.         return;  
    14.     }  
    15.     AfxMessageBox("图像点运算阈值化处理!",MB_OK,0);  
    16.     //读写文件  
    17.     FILE *fpo = fopen(BmpName,"rb");  
    18.     FILE *fpw = fopen(BmpNameLin,"wb+");  
    19.     fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
    20.     fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    21.     fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);  
    22.     fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);  
    23.     //处理  
    24.     unsigned char color;  
    25.     unsigned char red,green,blue;  
    26.     for(int i=0; i<m_nImage/3; i++ )  
    27.     {  
    28.         fread(&red,sizeof(char),1,fpo);  
    29.         fread(&green,sizeof(char),1,fpo);  
    30.         fread(&blue,sizeof(char),1,fpo);  
    31.   
    32.         if( (int)red > 128 )  
    33.             red=255;  
    34.         else  
    35.             red=0;  
    36.   
    37.         if( (int)green > 128 )  
    38.             green=255;  
    39.         else  
    40.             green=0;    
    41.           
    42.         if( (int)blue > 128 )  
    43.             blue=255;  
    44.         else  
    45.             blue=0;  
    46.   
    47.         fwrite(&red,sizeof(char),1,fpw);  
    48.         fwrite(&green,sizeof(char),1,fpw);  
    49.         fwrite(&blue,sizeof(char),1,fpw);  
    50.     }  
    51.     fclose(fpo);  
    52.     fclose(fpw);  
    53.     numPicture = 2;  
    54.     level=101;  
    55.     Invalidate();  
    56. }  
            运行效果如下图所示,感觉还挺好看的,显然此时的直方图就是0和255两条直线。


    五. 灰度均衡化

            灰度均衡化的目的是使一输入图像转换为在每一灰度级上都有相同的像素点(即输出的直方图是平的),它可以产生一幅灰度级分布概率均衡的图像。
            换句话说,经过均衡化后的图像在每一级灰度上像素点的数量相差不大,对应的灰度直方图的每一级高度也相差不大。它是增强图像的有效手段之一。
            研究思路是通过直方图变换公式实现:


            它的步骤如下图所示:

            例:有一幅图象,共有16级灰度,其直方图分布为Pi, i=0,1,…,15,求经直方图均衡化后,量化级别为10级的灰度图象的直方图分布Qi,其中Pi和Qi为分布的概率,即灰度i出现的次数与总的点数之比。
            Pi:0.03, 0, 0.06, 0.10, 0.20, 0.11, 0, 0, 0, 0.03, 0, 0.06, 0.10, 0.20, 0.11, 0
            步骤1:用一个数组s记录Pi,即s[0]=0.03,s[1]=0,s[2]=0.06,…,s[14]=0.11,s[15]=0
            步骤2:i从1开始,令s[i]=s[i]+s[i-1],得到的结果是s: 0.03,  0.03, 0.09,  0.19,  0.39, 0.50,  0.50,  0.50, 0.50,  0.53,  0.53, 0.59,  0.69,  0.89, 1.0,  1.0
            步骤3:用一个数组L记录新的调色板索引值,即令L[i]=s[i]×(10-1),得到的结果是L:0,0,1,2,4,5,5,5,5,5,5,5,6,8,9,9
            这样就找到了原来的调色板索引值和新的调色板索引值之间的对应关系,即
            0→0,  1→0, 2→1,  3→2,  4→4, 5→5,  6→5,  7→5, 8→5,  9→5,  10→5, 11→5,  12→6,  13→8, 14→9,  15→9。
           步骤4:将老的索引值对应的概率合并,作为对应的新的索引值的概率。例如,原来的索引值0,1都对应了新的索引值0,则灰度索引值为0的概率为P0+P1=0.03;新的索引值3和7找不到老的索引值与之对应,所以令Q3和Q7为0。最后得到的结果是Qi:0.03,  0.06, 0.10,  0,  0.20, 0.20,  0.10,  0, 0.20,  0.11 

            代码中有详细注释如下:
    1. // ID_DYS_JHH:表示图像均衡化 相见算法  
    2. void CImageProcessingView::OnDysJhh()   
    3. {  
    4.     if(numPicture==0) {  
    5.         AfxMessageBox("载入图片后才能图像均衡化!",MB_OK,0);  
    6.         return;  
    7.     }  
    8.     AfxMessageBox("图像均衡化!",MB_OK,0);  
    9.   
    10.     //第一步:获取图像的数据信息  
    11.     //此操作可以在打开图片时就进行 在直方图采样(ZFTCY)中也有该代码  
    12.     FILE *fpo = fopen(BmpName,"rb");  
    13.     fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
    14.     fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    15.   
    16.     int i,j,k;  
    17.     for(j=0;j<256;j++) { //定义数组并清零  
    18.         Red[j]=0;  
    19.         Green[j]=0;  
    20.         Blue[j]=0;  
    21.     }  
    22.       
    23.     //计算4个数据  
    24.     unsigned char red,green,blue;  
    25.     int IntRed,IntGreen,IntBlue;                  //强制转换  
    26.     double sumRedHD=0,sumGreenHD=0,sumBlueHD=0;   //记录像素总的灰度值和  
    27.     for(i=0; i<m_nImage/3; i++ )  
    28.     {  
    29.         fread(&red,sizeof(char),1,fpo);  
    30.         IntRed=int(red);  
    31.         sumRedHD=sumRedHD+IntRed;  
    32.         if( IntRed>=0 && IntRed<256 ) Red[IntRed]++;  
    33.           
    34.         fread(&green,sizeof(char),1,fpo);  
    35.         IntGreen=int(green);  
    36.         sumGreenHD=sumGreenHD+IntGreen;  
    37.         if( IntGreen>=0 && IntGreen<256 ) Green[IntGreen]++;  
    38.           
    39.         fread(&blue,sizeof(char),1,fpo);  
    40.         IntBlue=int(blue);  
    41.         sumBlueHD=sumBlueHD+IntBlue;  
    42.         if( IntBlue>=0 && IntBlue<256 ) Blue[IntBlue]++;  
    43.     }  
    44.     fclose(fpo);  
    45.   
    46.     /*****************************************************************/  
    47.     /* 图像均衡化处理                                                 
    48.     /* 利用全局变量 Red[256] Blue[256] Green[256]                     
    49.     /* 第一步:用3个数组Count..记录0-255灰度出现的概率,即             
    50.     /*        概率=该灰度出现次数*3/总得像素 (因为分成3部分RGB)       
    51.     /* 第二步:i从1开始,令s[i]=s[i]+s[i-1] 记录新概率数               
    52.     /* 第三步:用一个数组L记录新的调色板索引值,即                     
    53.     /*        L[i]=s[i]×(256-1)结果四舍五入2.8即为3                  
    54.     /* 第四步:将老的索引值对应的概率合并,作为对应的新的索引值的概率  
    55.     /*   1.原来的索引值0,1都对应了新的索引值0,则灰度索引值为0的概率  
    56.     /*     为P0+P1=0.03                                               
    57.     /*   2.新的索引值3和7找不到老的索引值与之对应,所以令Q3和Q7为0    
    58.     /*****************************************************************/  
    59.   
    60.     //记录出现的概率,会加到1 用于相加到调色板  
    61.     float CountRed[256],CountGreen[256],CountBlue[256];        
    62.     //记录原始数据,不会相加到1 用于计算新灰度概率  
    63.     float CountRedLin[256],CountGreenLin[256],CountBlueLin[256];     
    64.   
    65.     for( k=0 ; k<256 ; k++ )  
    66.     {  
    67.         CountRed[k]=(float)(Red[k])*3/m_nImage;  
    68.         CountRedLin[k]=CountRed[k];  
    69.         CountGreen[k]=(float)(Green[k])*3/m_nImage;  
    70.         CountGreenLin[k]=CountGreen[k];  
    71.         CountBlue[k]=(float)(Blue[k])*3/m_nImage;  
    72.         CountBlueLin[k]=CountBlue[k];  
    73.     }  
    74.       
    75.     for( k=1 ; k<256 ; k++ )  
    76.     {   
    77.         CountRed[k]=CountRed[k]+CountRed[k-1];  
    78.         CountGreen[k]=CountGreen[k]+CountGreen[k-1];  
    79.         CountBlue[k]=CountBlue[k]+CountBlue[k-1];  
    80.     }  
    81.   
    82.     /****************************************************/  
    83.     /* 此处百度到一个四舍五入浮点型的算法:               
    84.     /* float a=3.456;   保留到小数点后两位               
    85.     /* float b=(int)((a * 100) + 0.5) / 100.0;           
    86.     /* output b=3.46                                     
    87.     /****************************************************/  
    88.   
    89.     int LRed[256],LGreen[256],LBlue[256];   //记录调色板  
    90.     for( k=0 ; k<256 ; k++ )  
    91.     {  
    92.         LRed[k]=(int)(CountRed[k]*(256-1)+0.5);  
    93.         LGreen[k]=(int)(CountGreen[k]*(256-1)+0.5);  
    94.         LBlue[k]=(int)(CountBlue[k]*(256-1)+0.5);  
    95.     }  
    96.   
    97.     //第三步:处理均衡化图像写入 打开临时的图片  
    98.     fpo = fopen(BmpName,"rb");  
    99.     fread(&bfh,sizeof(BITMAPFILEHEADER),1,fpo);  
    100.     fread(&bih,sizeof(BITMAPINFOHEADER),1,fpo);  
    101.   
    102.     FILE *fpw = fopen(BmpNameLin,"wb+");  
    103.     fwrite(&bfh,sizeof(BITMAPFILEHEADER),1,fpw);  
    104.     fwrite(&bih,sizeof(BITMAPINFOHEADER),1,fpw);  
    105.   
    106.     //m_nWidth*m_nHeight 读取图片最后一行不为m_nWidth时会报错 改为m_nImage/3  
    107.     for( i=0; i<m_nImage/3 ; i++ )  
    108.     {     
    109.         fread(&red,sizeof(char),1,fpo);  
    110.         fread(&green,sizeof(char),1,fpo);  
    111.         fread(&blue,sizeof(char),1,fpo);  
    112.   
    113.         red=LRed[int(red)];  
    114.         green=LGreen[int(green)];  
    115.         blue=LBlue[int(blue)];  
    116.   
    117.         fwrite(&red,sizeof(char),1,fpw);  
    118.         fwrite(&green,sizeof(char),1,fpw);  
    119.         fwrite(&blue,sizeof(char),1,fpw);  
    120.     }  
    121.     fclose(fpw);  
    122.     numPicture = 2;  
    123.     level=101;  
    124.     Invalidate();     
    125. }  
            运行结果如下图所示,图像增强而且异常清晰:


            最后介绍下图像对比度拉伸,它就是把你感兴趣的灰度范围拉开,使得该范围内像素,亮的更亮,暗的更暗,从而达到增强对比度的目的。
            如下图所示,a、b、c为三段直线的斜率,g1old和g2old表示途中要进行对比度扩展的范围,g1new和g2new表示对应的新值。当g1old=g2old就是二值图像阈值化处理。
     
              由于灰度界别也是255这个约束,所以满足

           其中g1old=100,g2old=150,b=3.0的运行效果如下所示:
    展开全文
  • 对于一个数字图像处理系统来说,一般可以将处理流程分为3个阶段。在获取原始图像后,首先是图像预处理阶段,第二是特征抽取阶段,最后才是识别分析阶段。预处理阶段尤为重要,这个阶段处理不好则后面的工作根本无法...
  • 基于 MFC 的图像膨胀 & 图像腐蚀 & 开运算 & 闭运算
  • 本文为参考这位...代数运算对多幅图像处理,也不改变像素的空间位置;几何运算对单幅图像处理,改变像素的空间位置,几何运算包括两个独立的算法:空间变换算法和灰度级插值算法...
  • 数字图像处理(冈萨雷斯 第三版)

    万次阅读 多人点赞 2019-01-13 15:37:54
    1.1 图像与图像处理的概念 图像(Image): 使用各种观测系统以不同形式和手段观测客观世界而获得的,可以直接或间接作用于人眼并进而产生视觉的实体。包括: ·各类图片,如普通照片、X光片、遥感图片; ·各类...
  • 图像理论知识_什么是数字图像处理

    万次阅读 多人点赞 2018-04-21 16:54:26
    数字图像处理,即数字,将图像转化为数字的形式,对图像做处理,我们平时所见到的图像,在计算机中都是一组数字,当通过相机捕获现实世界的景物时,相机会捕获现实世界的光源信号,并转化为数字信号保存到存储器上,...
  • 数字图像处理概述

    千次阅读 2019-05-07 16:59:47
    图像处理的两个重要应用领域:(1)改善图像信息以便于人类理解 (2)为了方便存储、传输和表示而对图像进行处理,从而达到便于及其自动识别的目的。 什么是图像处理 简单来说,一幅图像可以认为就是一个二维...
  • 数字图像处理 总结

    万次阅读 2018-01-15 18:52:17
    图像概述 分类 属性 二维图像 三维图像 像素间关系 相关 图像预处理 颜色空间转换 RGB to Gray RGB三原色合成法 RGB to HSV 二值化 图像变换 图像复原和增强 图像平滑模糊 线性滤波器 非线性滤波器 图像增强...
  • 【图像处理】数字图像处理简介

    千次阅读 2019-12-20 10:36:34
    3.数字图像处理 4.什么是图像 5.数字图像和信号之间的关系 信号 关系 6.如何形成数字图像 7.应用 机器/计算机视觉 计算机图形学 人工智能 信号处理 1.介绍 数字图像处理(Digital Image Processing)是...
  • 数字图像处理——基于Matlab

    万次阅读 多人点赞 2018-06-18 20:25:13
    (注:本文代码大部分可从《数字图像处理 第三版》中找到)使用软件:MATLAB R2018a学习前提:了解matlab的GUI界面的每个按钮参考资料:《数字图像处理 第三版》,CSDN博客使用初音图片P站画师uid:1589657。...
  • 数字图像处理

    千次阅读 2019-03-04 13:38:44
    数字图像处理 利用计算机技术或其他数字技术,对图像信息进行数学运算与加工的处理 模拟图像处理 又称光学图像处理,利用光学透镜或光学照相方法对模拟图像进行处理 光电结合处理 (模拟图像处理与数字图像出入的...
  • 数字图像处理

    千次阅读 2010-11-01 11:19:00
    数字图像处理技术的发展显着,在过去十年,越来越多的信息正通过它的显示和分析传达。The way in which image data is stored and processed is fundamental to all aspects of information technology.在其中...
  • 数字图像处理

    千次阅读 2018-03-24 20:53:52
    最近开始学习数字图像处理,使用matlab实现,下面我就来记录笔记和体会,一方面是给大家提供参考,另一方面是防止我忘记了。复习一下:1.数字图像是用一个数字矩阵来表示的,数字阵列中的每个数字,表示数字图像的一...
  • 数字图像处理期中学习报告

    千次阅读 多人点赞 2017-12-03 17:28:28
    数字图像处理数字图像处理 一学习内容总结 第一章 绪论 1 什么是数字图像处理 2 使用数字图像处理领域的实例 3 数字图像处理的基本步骤 4 图像处理系统的组成 第二章 数字图像处理基础 1 视觉感知要素 2 光和电磁...

空空如也

1 2 3 4 5 ... 20
收藏数 190,554
精华内容 76,221
关键字:

数字图像处理