精华内容
下载资源
问答
  • 灰度变换与空间滤波

    2019-10-31 09:53:37
    灰度变换与空间滤波 空间域:图像平面本身 空间域处理:灰度变换、空间滤波 灰度变换:对图像单个像素进行操作,主要以对比度和阈值处理为目的 空间滤波:涉及改善性能的操作,如通过图像中的每个像素的邻域处理来...

    灰度变换与空间滤波

    空间域:图像平面本身
    空间域处理:灰度变换、空间滤波
    灰度变换:对图像单个像素进行操作,主要以对比度和阈值处理为目的
    空间滤波:涉及改善性能的操作,如通过图像中的每个像素的邻域处理来锐化图像

    灰度变换

    最小邻域的大小为1×1。在这种情况下,g 仅取决于点(x,y)处的灰度值f ,而T则成为一个形如下式的灰度(也称为灰度级或映射)变换函数:
    S = T(r)

    其中,为表达方便,另r和S分别表示变量,即g和f 在任意点(x,y)处的灰度。

    例如,如果T(r)有如图所示的形式

    在这里插入图片描述

    对f 中每一个像素施以变换产生相应的g的像素的效果将比原图像有更高的对比度。这种技术被称为对比度拉伸。低于k的灰度更暗,高于k的灰度更亮

    极限情况下,会产生二级(二值)图
    在这里插入图片描述
    **

    基本灰度变化函数

    **

    1. 图像反转

    S = L - 1 - r

    特别适用于增强嵌入在一幅图像的暗区域中的白色或灰色细节,主要用于观察过黑的图片,负片变换之后,方便观察。很简单的变换。
    在这里插入图片描述

    2. 对数变换

    S = c * log(1+ r)
    在这里插入图片描述

    ①因为对数曲线在像素值较低的区域斜率较大,像素值较高的区域斜率比较低,所以图像经过对数变换之后,在较暗的区域对比度将得到提升,因而能增强图像暗部的细节。

    ②图像的傅里叶频谱其动态范围可能宽达0~10^6。直接显示频谱的话显示设备的动态范围往往不能满足要求,这个时候就需要使用对数变换,使得傅里叶频谱的动态范围被合理地非线性压缩。在这里插入图片描述
    底数越大,对低灰度部分的强调就越强,对高灰度部分的压缩也就越强。相反的,如果想强调高灰度部分,则用反对数函数就可以了
    在这里插入图片描述

    3. 幂律(伽马)变换

    S = c r ^γ*

    幂律变换与对数变换一样,也可以扩展和压缩一些灰度级,且应用的更为广泛。
    在这里插入图片描述

    当 \gamma>1时,效果和对数函数相似,放大暗处细节,压缩亮处细节,随着数值减少,效果越强(越来越暗)
    当 \gamma<1时,放大亮处细节,压缩暗处细节,随着数值增大,效果越强(越来越亮 )

    4. 分段线性变换函数

    通过分段线性函数我们可以将我们感兴趣的灰度值突显出来
    通过分段函数来输出不同程度的灰度级扩展,从而来影响输出图像的对比度。

    (1)对比度拉伸
    在这里插入图片描述
    对比度拉伸是扩展图像灰度等级动态范围的处理,它可以跨越记录介质和显示装置的全部灰度范围

    (2) 灰度级分层

    突出图像中的特定灰度范围有重要的应用,可以用于增强特征。比如卫星图像中的水和X射线图像中的缺陷。主要有两种实现方式,一种方法是将图像中感兴趣的灰度范围显示为一个值,其余灰度范围显示为另外一个值,二值化。另外一种方法是使感兴趣的范围变亮,其他的灰度范围不变。
    在这里插入图片描述
    (3)比特级分层

    像素是由比特值组成的数字。可以突出不同的比特平面来处理图像。
    对图像压缩也很有用。图像压缩是使用较少的比特平面重建一个图像。

    例:显示一幅8比特图像的第8个比特平面。将0~127间所有灰度映射为0,将128-255间灰度映射为1

    直方图处理

    1. 直方图均衡

    直方图均衡化的作用是图像增强。这种方法对于背景和前景都太亮或者太暗的图像非常有用

    直方图应用:图像增强,图像压缩和图像分割。
    在这里插入图片描述
    rk是第k级灰度值,nk是图像中灰度为rk的像素的个数。
    在这里插入图片描述
    归一化直方图:
    P(r_{k})=n_{k}/n
    p(rk)表示像素值rk在图像中出现的概率

    S=T(r)=\sum_{j=0}{k}P_{r}(r_{j})=\sum_{j=0}{k}n_{j}/n
    在这里插入图片描述
    暗图像:直方图分布集中在灰度级低端
    亮图像:直方图分布集中在灰度级高端
    低对比度:具有较窄的直方图,且集中于灰度级中部
    高对比度:直方图覆盖率很宽的灰度级范围,像素分布没有太不均匀

    结论:若一幅图像的像素倾向于占据整个可能的灰度级且分布均匀,则该图像对比度较高并展示灰色调的较大变化。最终效果为一幅灰度细节丰富且动态范围较大的图像。

    r表示处理图像的灰度。 r = 0 为黑色, r = L-1 为白色
    在这里插入图片描述
    对于上面的函数,有以下假设:

    a.T® 在区间[0,L-1]上是单调递增(递减)的。

    b. 对于 ,有
    。

    通常在图像处理中选择如下的变换函数:在这里插入图片描述
    上式右端是随机变量r的累计分布函数(CDF)的表示形式,其中pr 是随机变量r的概率密度函数。选定这个函数作为转换函数的原因在于使用这个函数求得的输出变量的概率密度函数总是服从均匀分布的。无论输入变量的概率密度函数的具体形式如何,都不会影响输出变量的概率密度函数的形式。

    变换函数离散形式为:
    在这里插入图片描述

    为什么要选用累积分布函数

    均衡化过程中,必须要保证两个条件:①像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;②如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数,使用累积分布函数处理后像素值会均匀分布。

    2. 直方图匹配(规定化)

    有时需要处理后的图像具有规定的直方图形状,这种用于产生处理后有特殊直方图的方法称为直方图匹配或者直方图规定化(是在均衡的基础上的)

    ==========================================================

    空间滤波

    灰度化,也就是黑白化,就是将图像进行黑白处理,使其失去色彩。而从像素点出发,就是使各个像素点的三种颜色分量R、G、B的值相同。
    锐化就是通过增强高频分量来减少图象中的模糊,因此又称为高通滤波。锐化处理在增强图象边缘的同时增加了图象的噪声。
    滑与锐化相反,就是滤掉高频分量,从而达到减少图象噪声,使图片变得有些模糊。

    平滑滤波器主要是使用邻域的均值(或者中值)来代替模板中心的像素,消弱和邻域间的差别,以达到平滑图像和抑制噪声的目的;相反,锐化滤波器则使用邻域的微分作为算子,增大邻域间像素的差值,使图像的突变部分变的更加明显。

    展开全文
  • 这里写目录标题本节的目标背景灰度变换空间滤波基础 本节的目标 了解空间域图像处理的意义,以及它变换域图像处理的区别 熟悉灰度变换所有的主要技术 了解直方图的意义以及如何操作直方图来增强图像 了解空间...

    本节的目标

    • 了解空间域图像处理的意义,以及它与变换域图像处理的区别
    • 熟悉灰度变换所有的主要技术
    • 了解直方图的意义以及如何操作直方图来增强图像
    • 了解空间滤波的原理
    import sys
    import numpy as np
    import cv2
    import matplotlib 
    import matplotlib.pyplot as plt
    import PIL
    from PIL import Image
    
    print(f"Python version: {sys.version}")
    print(f"Numpy version: {np.__version__}")
    print(f"Opencv version: {cv2.__version__}")
    print(f"Matplotlib version: {matplotlib.__version__}")
    print(f"Pillow version: {PIL.__version__}")
    
    Python version: 3.6.12 |Anaconda, Inc.| (default, Sep  9 2020, 00:29:25) [MSC v.1916 64 bit (AMD64)]
    Numpy version: 1.16.6
    Opencv version: 3.4.1
    Matplotlib version: 3.3.2
    Pillow version: 8.0.1
    
    def normalize(mask):
        return (mask - mask.min()) / (mask.max() - mask.min() + 1e-5)
    

    背景

    灰度变换和空间滤波基础

    g(x,y)=T[f(x,y)](3.1) g(x, y) = T[f(x, y)] \tag{3.1}

    式中f(x,y)f(x, y)是输入图像, g(x,y)g(x, y)是输出图像,TT是在点(x,y)(x, y)的一个邻域上定义的针对f的算子。

    最小的邻域大小为1×11\times 1
    则式(3.1)中的TT称为灰度(也称灰度级或映射)变换函数,简写为如下:
    s=T(r)(3.2) s=T(r) \tag{3.2}

    对比度拉伸

    • 通过将kk以下的灰度级变暗,并将高于kk的灰度级变亮,产生比原图像对比度更高的一幅图像

    阈值处理函数

    • 小于kk的处理为0,大于kk的设置为1,产生一幅二级(二值)图像
    # 显示一个图像的3x3邻域
    height, width = 18, 18
    img_ori = np.ones([height, width], dtype=np.float)
    
    # 图像3x3=9个像素赋了不同的值,以便更好的显示
    kernel_h, kernel_w = 3, 3
    img_kernel = np.zeros([kernel_h, kernel_w], dtype=np.float)
    for i in range(img_kernel.shape[0]):
        for j in range(img_kernel.shape[1]):
            img_kernel[i, j] = 0.3 + 0.1 * i + 0.1 * j
    img_kernel[kernel_h//2, kernel_w//2] = 0.9
    
    img_ori[5:5+kernel_h, 12:12+kernel_w] = img_kernel
    
    fig = plt.figure(figsize=(7, 7), num='a')
    plt.matshow(img_ori, fignum='a', cmap='gray', vmin=0, vmax=1)
    plt.show()
    

    在这里插入图片描述

    为什么会把Sigmoid函数写在这里

    从Sigmoid函数的图像曲线来看,与分段线性函数的曲线类似,所以在一定程度上可以用来代替对比度拉伸,这样就不需要输入太多的参数。当然,有时可能也得不到想要的结果,需要自己多做实验。

    sigmoid函数也是神经网络用得比较多的一个激活函数。

    def sigmoid(x, scale):
        """
        simgoid fuction, return ndarray value [0, 1]
        param: input x: array like 
        param: input scale: scale of the sigmoid fuction, if 1, then is original sigmoid fuction, if < 1, then the values between 0, 1
        will be less, if scale very low, then become a binary fuction; if > 1, then the values between 0, 1 will be more, if scale
        very high then become a y = x
        """
        y = 1 / (1 + np.exp(-x / scale))
        return y
    
    # sigmoid fuction plot
    x = np.linspace(0, 10, 100)
    x1 = x - x.max() / 2        # Here shift the 0 to the x center, here is 5, so x1 = [-5,  5]
    t_stretch = sigmoid(x1, 1)
    t_binary = sigmoid(x1, 0.001)
    
    plt.figure(figsize=(10, 5))
    plt.subplot(121), plt.plot(x, t_stretch), plt.title('s=T(r)'), plt.ylabel('$s_0 = T(r_0)$', rotation=0)
    plt.xlabel('r'), plt.xticks([]), plt.yticks([])
    plt.subplot(122), plt.plot(x, t_binary), plt.title('s=T(r)'), plt.ylabel('$s_0 = T(r_0)$', rotation=0)
    plt.xlabel('r'), plt.xticks([]), plt.yticks([])
    plt.tight_layout
    plt.show()
    

    在这里插入图片描述

    展开全文
  • 第二章 灰度变换与空间滤波 灰度变换函数 对数及对比度拉伸变换 实用M函数 绘制图像直方图第二章 灰度变换与空间滤波灰度变换函数

    第二章 灰度变换与空间滤波

    灰度变换函数

    • imadjust函数

      g = imadjust(f, [low_in high_in], [low_out high_out], gamma)

      其中f为一个灰度级图片,
      [low_in high_in], [low_out high_out]的值只能在0和1之间,如果使用空矩阵([ ]), 会得到默认值[0 1]。若high_out小于low_out,输出灰度将被反转。
      gamma的值决定了图像g的曲线形状。若gamma的值小于1,则映射被加权至较高(亮)的输出值(曲线上凸),若gamma的值大于1,则映射被加权至较低(暗)的输出值(曲线下凹),若参数缺省,则gamma为1,线性映射。
    >> f = imread('cat1.jpg');
    >> g1 = imadjust(f, [0 1], [1, 0]);
    >> imshow(g1)
    ![cat1](https://img-blog.csdn.net/20170616215049563?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzgzMTEwNDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![cat2](https://img-blog.csdn.net/20170616215120388?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzgzMTEwNDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

    imcomplement函数能达到同样的效果

    >> g2 = imadjust(f, [0.5 0.75], [0 1]);
    >> imshow(g2)
    ![这里写图片描述](https://img-blog.csdn.net/20170616215713020?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzgzMTEwNDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

    此类处理可以用于强调感兴趣灰度区

    • stretchlim函数
      Low_High = stretchlim(f)
      主要用于自适应找到一个分割阈值向量来改变一幅图像的对比度
    >> g = imadjust(f, stretchlim(f), [ ]);
    >> imshow(g)
    ![这里写图片描述](https://img-blog.csdn.net/20170616220508102?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzgzMTEwNDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
    >> g = imadjust(f, stretchlim(f), [1 0]);
    >> imshow(g)
    ![这里写图片描述](https://img-blog.csdn.net/20170616220744494?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzgzMTEwNDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

    对数及对比度拉伸变换

    gs = im2uint8(mat2gray(g));
    对比度拉伸变换:g = 1./(1 + (m./f).^E)

    >> f = imread('D:\picture\素\d1.jpg');
    >> imshow(f)
    >> g = im2uint8(mat2gray(log(1 + double(f))));
    >> imshow(g)
    ![这里写图片描述](https://img-blog.csdn.net/20170616223407007?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzgzMTEwNDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![这里写图片描述](https://img-blog.csdn.net/20170616223429918?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXFfMzgzMTEwNDE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

    实用M函数

    • nargin用于检测输入到M函数的参数数目
    • nargout用于检测M函数的输出个数
    • nargchk用于检测传递的参量的数量是否正确
    • function [m, n] = test(varargin)可接收可变数量的输入
    • function [varargout] = text(m, n, p)可返回可变数量的输出

    绘制图像直方图

    >> f = imread('cat1.jpg');
    >> imhist(f);

    这里写图片描述

    >> f = imread('cat1.jpg');
    >> h = imhist(f, 25);
    >> horz = linspace(0, 255, 25);
    >> bar(horz, h)

    这里写图片描述

    展开全文
  • 数字图像处理第二章灰度变换与空间滤波灰度变换与空间滤波1 背景知识2 灰度变换2.1基本的灰度变换函数2.2 直方图处理 灰度变换与空间滤波 本章我们将学习空间域处理中主要的两类方法灰度变换和空间滤波,灰度变换对...

    灰度变换与空间滤波

    本章我们将学习空间域处理中主要的两类方法灰度变换和空间滤波,灰度变换对图像的单个像素进行操作,主要以对比度和阈值处理为目的;空间滤波涉及改善性能的操作,如通过图像中每个像素的邻域处理来锐化图像。接下来我们将从理论到实验来深入理解这两种方法。

    1 背景知识

    本章里我们所讨论的所有图像处理技术都是在空间域进行的,我们所知道的空间域就像上一章中介绍的一样是包含图像像素的简单平面。故我们本章讨论的空间域处理可由下式表示:g(x,y)=T[f(x,y)]g(x,y)=T[f(x,y)]上式中,f(x,y)是输入图像,g(x,y)是处理后的图像,T是在点(x,y)的邻域上定义的关于f的一种算子。算子可应用于单幅图像或图像集合,在数字图像处理中,算子是一个很重要的概念,现在让我们具体理解一下。

    上式中我们的(x,y)是图像中的任意一个位置,包含该点的小区域是点(x,y)的邻域,我们接下来接触的邻域大多数都是中心在(x,y)矩形,邻域原点从一个像素向另外一个像素移动,对邻域中的像素应用算子T,并在该位置产生输出。这样,对于任意指定位置(x,y)输出图像g在这些坐标处的值,等于对f中以(x,y)为原点的邻域应用算子T的结果。

    在下图中,开始的邻域原点在A5处,通过使用一个预定义的算子,根据算子的运算由邻域中的A1到A9(包括A5)像素的值运算得到新的在A5点像素的值,得到新的A5值以后邻域会移动,邻域中心移动到下一个位置B5,通过上述运算得到新的B5的值,直到图像中所有需要运算的像素点全部进行运算。

    算子
    上面我们描述的过程称为空间滤波,其中邻域与预定义的操作一起称为空间滤波器(也被称为空间掩模、核、模板或窗口)。

    我们大概了解了空间滤波方法,那么如果我们把邻域缩小到1×1,在这种情况下,新的像素值g仅仅取决于点(x,y)处的f值,那么我们就引出了灰度变换的概念,并且我们可以得到一个形如下式的灰度变换函数s=T(r)s=T(r)上式中s和r表示g和f在任意点(x,y)处的灰度,由此我们可见,灰度变换实际上是空间滤波的一种特殊形式,那么接下来让我们一起深入学习一下灰度变换和空间滤波的理论和方法吧!

    2 灰度变换

    2.1基本的灰度变换函数

    下图中显示了图像增强(视觉感触最明显的应用领域)常用的三类基本函数:线性函数(反转变换和恒等变换),对数函数(对数和反对数变换)和幂律函数(n次幂和n次根变换)。

    灰度变换函数
    (Ⅰ)图像反转
    图像反转就是上图中的反转变换,可得到灰度级范围为[0,L-1]的一幅图像的反转图像,该反转图像由下式给出:s=L1rs=L-1-r使用这种变换可以反转一幅图像的灰度级,从而去突出图像暗色区域中的白色或灰色细节,特别是当黑色面积在尺寸上占主导地位时。

    (Ⅱ)对数变换
    对数变换的通用形式为s=clog(1+r)s=clog(1+r)上式中的c是常数,并且假设r大于等于0。由上图我们可以看到,对数变换可以将输入中范围较窄的低灰度值映射为输出中范围较宽的灰度值,或将输入中范围较宽的灰度值映射为输出中范围较窄的灰度值。我们使用对数变换可以用来扩展图像中的暗像素值,同时压缩更高灰度的值。反对数函数作用刚好相反。

    (Ⅲ)幂律(伽马)变换
    幂律变换的基本形式为s=crγs=cr^γ上式中c和γ是正常数,我们调整γ的值可以得到很多的伽马变换。

    伽马
    我们从上图中很容易发现伽马变换与对数变换的相似处,但是变化取决于γ的取值,我们可以使用伽马变换去增强对比度,对于整体比较暗的图像,选择一个小于1的伽马值,来扩展灰度级;对于整体比较亮的图像,选择一个大于1的伽马值,来压缩灰度值。

    我们下面使用matlab中的imadjust函数去简单看一下图像的灰度变换。

    f = imread('jimei3.jpg'); 
    g = rgb2gray(f); 							%将彩色图像变换为灰度图像
    g1 = imadjust(g, [0 1], [1 0]);  			%对图像的像素值进行翻转
    g2 = imadjust(g, [0.5 0.75], [0 1]);		%将图像像素灰度值在[0.5 0.75]范围内扩展到[0 1]内
    g3 = imadjust(g, [0 1], [0.5 0.75]);		%将图像像素灰度值在[0 1]范围压缩到[0.5 0.75]
    g4 = imadjust(g, [], [], 2);				%用非线性变换 伽马大于1时
    g5 = imadjust(g, [], [],0.6);				%用非线性变换 伽马小于1时
    

    结果如下

    12
    1
    11
    上面图片按照顺序为g,g1, g2, g3, g4, g5
    分析:
    (1)我们对g进行翻转操作得到g1负片图像,在这种情况下我们更容易去用肉眼观察到本身灰度值较大区域的一些细节。
    (2)g2则是将中间灰度向两侧拉伸,将图像变得更加鲜艳,如果是彩色图像会更加明显。
    (3)g3与g2相反,我们去缩小对比度,图像变得更加模糊,如果作用于对比度较高的图片优化效果会更好。
    (4)g4使用非线性变换,采用伽马值大于1的伽马变换去处理图像灰度值,整体拉高了中间灰度,使图像变得更加明亮,作用于对比度较低的图像效果会更好。
    (5)g5也使用非线性变换,采用伽马值小于1的伽马变换去处理图像灰度值,整体降低了中间灰度,使图像变得更加暗淡,作用于对比度较高的图像效果会更好。

    matlab中的stretchlim函数可以根据图像生成一个两元素的向量,自动去完成一个对比度的拉伸。

    Low_High = stretchlim(f);
    g6 = imadjust(f,Low_High,[]);
    

    效果如下
    11

    2.2 直方图处理

    直方图处理是本章中的重点也是难点,我们要认真从理论到实践都要理解透彻。

    2.2.1 直方图是什么
    灰度级范围为[0,L-1]的数字图像的直方图是离散函数h(rk)=nk,其中rk是第k级灰度值,nk是图像中灰度为rk的像素个数。在实践中我们经常用乘积MN表示的图像总像素除每个分量来归一化直方图,通常M和N是图像的行数和列数。归一化后的直方图由p(rK)=nk/MN给出,简单来说,p(rk)是灰度级rk在图像中出现的概率的估计。

    matlab中最简单的直方图绘制函数就是imhist

    f = imread('jimei2.jpg');
    g = rgb2gray(f);
    imhist(g);
    

    11
    实际上这里绘制的是彩色图像灰度化的直方图。

    2.2.2 直方图均衡
    我们先从理论阶段学习直方图均衡,假设图像灰度值是连续的,并且用变量r表示待处理图像的灰度。通常,我们假设r的取值区间为[0,L-1],且r=0表示黑色,r=L-1表示白色。在r满足这些条件的情况下,我们将注意力集中在下面的变换形式上s=T(r),0rL1s=T(r),0≤r≤L-1我们称这个变换形式为灰度映射,对于输入图像中每个具有r值的像素产生一个输出灰度值s。同时上式是在以下的两个假设上成立
    (a)T(r)在区间 0 ≤ r≤ L-1 上为严格的单调递增函数。
    (b)当 0 ≤ r ≤ L-1时,0 ≤ T(r)≤ L-1。
    同时在稍后我们要学习的直方图规定化中我们会用到反函数r=T1(s),0sL1r=T^{-1}(s),0≤s≤L-1
    现在我们令pr(r)和ps(s)分别表示随机变量r和s的概率密度函数,我们认为在理想条件下图像灰度值的概率分布函数在直方图均衡的前后是不变的,于是我们可以得到下式(Ⅰ):
    ps(s)=d[rpr(r)dr]drdrds=prdrdsp_s(s)=\frac{d[\int^r_{-\infty}p_r(r)dr]}{dr}\cdot\frac{dr}{ds}=p_r\frac{dr}{ds} 同时我们灰度映射函数用pr可以表示为(Ⅱ):s=T(r)=(L1)0rpr(w)dws=T(r)=(L-1)∫_{0}^rp_r(w)dw这里的w是积分的假变量,式子右边是随机变量r的累积分布函数,接着我们用基本积分学中的莱布尼兹准则去化简上面两个式子,得到dr/ds的积分值(Ⅲ):dsdr=dT(r)dr=(L1)d[0rpr(w)dw]dr=(L1)pr(r)\frac{ds}{dr}=\frac{dT(r)}{dr}=(L-1)\frac{d[\int^r_{0}p_r(w)dw]}{dr}=(L-1)p_r(r)我们再把式(Ⅲ)代入式(Ⅰ)化简既可以得到:ps(s)=1L1p_s(s)=\frac{1}{L-1}到此我们的理论推导就结束了,我们可以得到一个很清晰的结果,就是在图像灰度值是连续的情况下我们可以找到灰度映射函数将直方图变换成一个完全符合均匀分布的直方图。

    但是在我们实际处理的图像中,像素的灰度值都是离散的,所以我们处理其概率(直方图值)与求和来替代处理概率密度函数与积分。我们类比前面连续情况下的推导,一幅数字图像中灰度级rk出现的概率我们近似为:pr(rk)=nkMNp_r(r_k)=\frac{n_k}{MN}上面理论推导中的(Ⅱ)式我们也可以从离散形式表示为:sk=T(rk)=(L1)j=0kpr(rj)=(L1)MNj=0knjs_k=T(r_k)=(L-1)\sum_{j=0}^kp_r(r_j)=\frac{(L-1)}{MN}\sum_{j=0}^kn_j在这个公式中,变换(映射)T(rk)称为直方图均衡直方图线性变换

    matlab中直方图均衡化由工具箱中的 histeq 函数实现

    imhist(g);
    ylim('auto')
    g2 = histeq(g, 256);
    figure,imshow(g2);
    figure,imhist(g2);
    ylim('auto')
    imshow(g);
    

    11上方为直方图未处理时,下方为直方图均衡化以后。
    11
    分析:我们由此可见虽然我们在理论上可以让变换后的直方图为均匀分布,但是实际离散效果下我们可以看到直方图均衡化以后更多的是让图像有一个较好的对比度,同时使得原直方图再变换以后更加“平滑”,但变换的图像在边缘处明显有一点失真,出现了伪轮廓。

    2.2.3 直方图匹配(规定化)
    直方图均衡能自动地确定变换函数,该函数寻求产生有均匀直方图的输出图像,当我们需要自动增强时,这是一种好方法,但对于某些应用时,采取均匀直方图的基本增强并不是一种最好的解决方法,有时我们希望处理后的图像具有规定的直方图形状可能会更加有用,我们称这个过程为直方图匹配直方图规定化

    直方图匹配的理论在这里就不给大家推导了,如果你可以详细明白直方图均衡的理论推导,那么直方图匹配的理论推导对你并没有难度。如果我们想要将图像A的直方图变为目标直方图B,那么就进行以下过程:在这里插入图片描述
    这样我们就可以看出直方图匹配实质上是两次直方图均衡的复合形式,以均匀分布为中介作为媒介变换直方图。

    f = rgb2gray(imread('jimei1.jpg'));
    g = rgb2gray(imread('jimei2.jpg'));
    g1 = imhist(g);
    match = histeq(f,g1);
    figure;
    subplot(2, 3, 1), imshow(f), title('Original image');
    subplot(2, 3, 2), imshow(g), title('Template image');
    subplot(2, 3, 3), imshow(match), title('Matched image');
    subplot(2, 3, 4), imhist(f), title('Histogram of original image');
    subplot(2, 3, 5), imhist(g), title('Histogram of Template image');
    subplot(2, 3, 6), imhist(match), title('Histogram of Matched image');
    

    结果如下
    在这里插入图片描述
    分析:我们还是可以从结果看出来直方图匹配达到效果还是比较明显的,我们可以看到由于模板图像的直方图较暗这样使得最后匹配的图像也明显较暗,这样就显现出了直方图规定化的优势所在,我们不需要去平衡整个图像的对比度,在实际操作中,我们往往就光去放大我们感兴趣的目标点特征就好了,比如脑部CT图像,我们仅仅去放大肿瘤的对比度使得我们可以很好的观察他的结构与特征,其他健康部位的信息我们反而不需要去关注,甚至摸除了健康部分的特征也是我们可以接受的。

    3 空间滤波

    3.1空间滤波基础

    空间滤波是图像处理领域应用广泛的主要工具之一,我们前面已经简单介绍过了,滤波一词借用于频率域处理,滤波是指接受(通过)或者拒绝一定的频率成分,就像我们前面介绍的,空间滤波器由一个邻域(通常是一个较小的矩形),对该邻域所包围图像像素执行预定义操作组成。滤波产生一个新像素,新像素的坐标等于邻域中心的坐标,像素的值是滤波操作的结果。

    在执行线性空间滤波时,我们必须要清楚两个相近的概念。一个是相关,另一个是卷积。这里就不详细介绍两个基本概念了,没有接触过的同学可以先查一下,接下来我们将从两个角度去深入空间滤波的学习。

    3.2 平滑空间滤波器

    平滑滤波器顾名思义,主要用于图像的模糊处理和降低噪声,通常我们可以用于图像的预处理任务中,提前去除一些我们不敢兴趣的琐碎细节,平滑滤波器也分为平滑线性滤波器和非线性滤波器。

    3.2.1 平滑线性滤波器

    我们先来接触一个最简单最直观的平滑滤波器,也就是均值滤波器,它使用滤波器模板确定的邻域内像素的平均值来代替图像中每个像素的值,这种处理降低了图像中尖锐的变换同时可以消除典型的随机噪声引起的剧烈变化,对于下图左边的3×3平滑滤波器,从它的代入式我们就可以清晰的看出他的作用:R=19i=19ziR=\frac{1}{9}\sum_{i=1}^9z_i所有系数相等的空间均值滤波器有时都被称为box模板。
    在这里插入图片描述
    上图中右边的加权均值模板更为重要,它并不是仅仅取邻域内像素的平均值,而是还考虑到了周围邻域内距离原点远近的权值,最后得到的结果是一个加权平均的过程,考虑权值这种思想应用于不止图像处理,还应用于许多算法和学科当中。如果我们将这种权值在去细分,我们就可以得到如下图的高斯核会更加考虑到每个像素位置的权值。在这里插入图片描述

    空间均值处理的一个重要应用是,模糊图像以便得到感兴趣物体的粗略描述,因此那些较小物体的灰度就会与背景混合在一起,较大物体则变得像“斑点”而易于检测。

    我们这里用3×3的滤波器去简单实验一下:

    f = rgb2gray(imread('dog1.jpg'));
    g = im2double(f);
    w = ones(9);
    gd = imfilter(g,w);
    imshow(gd,[]);
    

    结果如下 我们还是可以看到很明显的模糊
    11

    3.2.2 统计排序(非线性)滤波器

    统计排序滤波器是一种非线性空间滤波器,这种滤波器的响应以滤波器包围的图像区域中包含得像素排序(排队)为基础,然后使用统计排序结果决定的值代替中心像素的值。

    中值滤波器是最知名的排序滤波器,常用于处理脉冲噪声,也叫做椒盐噪声,下图就是一个中值滤波器应用的情况,在对于单个或者单方向的脉冲噪声就很好用中值滤波器消除。
    在这里插入图片描述
    这里我们用matlab中的函数 medfilt2 的中值滤波来实验一下:

    f = rgb2gray(imread('dog3.jpg'));
    figure;
    subplot(2,2,1), imshow(f),title('Original image');
    fn = imnoise(f,'salt & pepper',0.2);
    subplot(2,2,2),imshow(fn),title('Images polluted by salt and pepper noise');
    gm = medfilt2(fn);
    subplot(2,2,3),imshow(gm),title('Median filter noise reduction');
    gms = medfilt2(fn, 'symmetric');		%symmetric选项去除了图像边沿外黑点的影响
    subplot(2,2,4),imshow(gms),title('Strengthen median filter to reduce noise');
    

    在这里插入图片描述

    3.3 锐化空间滤波器

    3.3.1 图像锐化原理

    我们刚才学习的平滑滤波器的任务是去模糊图像,那么锐化空间滤波器的任务就是去突出图像中的点和线,大家可以思考一下图像什么地方是点和线,也就是灰度变化较大的地方,两种灰度过渡的部分。于是我们就开始思考我们用一种什么属性去刻画图像中这些变化较大的特征,如果我们把一幅图像按照灰度值去扩大到三维,那么变化较大的地方就会形成一个“斜坡”或者是“悬崖”,这种情况就很好的用我们从初中开始学习的导数(微分)来去刻画它们,更加“陡峭”的地方导数就越大,更加“平缓”的地方导数就越小,“平坦”的区域导数就为零了。

    在图像中我们每个点都是离散的,所以我们无法去定义连续的导数,于是我们就在离散情况下定义一阶和二阶微分。一维函数f(x)的一阶微分的基本定义是差值:fx=f(x+1)f(x)\frac{∂f}{∂x}=f(x+1)-f(x)二阶微分定义为如下差分:2fx2=f(x+1)+f(x1)2f(x)\frac{∂^2f}{∂x^2}=f(x+1)+f(x-1)-2f(x)

    3.3.2 拉普拉斯算子(二阶微分)

    这里我们先学习一种各向同性滤波器,这种滤波器的响应与滤波器作用的图像的突变方向无关,也就是原图像旋转以后滤波处理的结果也是一样的。最简单的各向同性微分算子是拉普拉斯算子。一个二维图像函数f(x,y)的拉普拉斯算子定义为2f=2fx2+2fy2▽^2f=\frac{∂^2f}{∂x^2}+\frac{∂^2f}{∂y^2}同时我们也要定义离散拉普拉斯算子是2f(x,y)=f(x+1,y)+f(x1,y)+f(x,y+1)+f(x,y1)4f(x,y)▽^2f(x,y)=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)在这里插入图片描述
    上图展示了三种拉普拉斯算子,最左边的算子表示上面定义的离散拉普拉斯算子,只不过取了一个负号,效果是相同的,但在将拉普拉斯算子滤波后的图像与其他图像合并时,必须要考虑符号上的差异,这也是为什么要取一个负值的原因。

    matlab中预定义的二维线性空间滤波器,可通过函数 fspecial 实现:

    f = imread('dog2.jpg');
    figure;
    subplot(1,2,1),imshow(f),title('Original image');
    w = fspecial('laplacian',0);
    g = imfilter(f,w,'replicate');
    subplot(1,2,2),imshow(g),title('Laplace filtering');
    

    在这里插入图片描述
    如果仔细去看还是可以看出原图像中小狗的轮廓的,拉普拉斯算子增强主要是将算子得到的图像再叠加到原图像之上,这里叠加以后效果不明显我就不放出来了,感性的同学可以拿较暗的图片来进行一下锐化。

    3.3.3 Sobel算子(一阶微分)

    图像处理中的一阶微分是用梯度幅值来实现的,梯度也就是(x,y)处f的最大变换率的方向,向量▽f的幅值表示为M(x,y),即M(x,y)=mag(f)=gx2+gy2M(x,y)=mag(▽f)=\sqrt{g^2_x+g^2_y}通常我们在实现中,使用绝对值来近似平方和平方根操作更适合于计算:M(x,y)gx+gyM(x,y)≈\left|g_x\right|+\left|g_y\right|在这里插入图片描述
    由上图两个sobel算子可以看出,sobel算子本身就是有方向的,我们去锐化图像时需要叠加不同方向上的一阶微分来求得梯度的幅值。

    我们用与拉普拉斯算子同样的函数去处理得到一张梯度的幅值试一下:

    w1 = fspecial('sobel');
    g = imfilter(f,w1,'replicate');
    figure;
    subplot(1,2,1),imshow(f),title('Original image');
    subplot(1,2,2),imshow(g),title('Sobel filtering');
    

    在这里插入图片描述
    就此我们可以看到梯度的幅值对于拉普拉斯算子来说比较明显,原因也是因为sobel算子从不同方向上去检测梯度的变化,因此sobel算子在边缘检测上起着重要的作用。

    展开全文
  • 数字图像处理——第三章 灰度变换与空间滤波

    千次阅读 多人点赞 2021-04-17 15:39:01
    数字图像处理——第3章 灰度变换与空间滤波 文章目录数字图像处理——第3章 灰度变换与空间滤波写在前面3.1 灰度变换3.1.1 基本的灰度变换函数图像反转对数变换伽玛变换分段线性变换函数--三种3.1.2 直方图处理直方...
  • 灰度变换与空间滤波
  • 灰度变换与空间滤波-学习提纲

    千次阅读 2014-07-24 15:05:15
    灰度变换与空间滤波 一、引言 1.空域处理:灰度变换和空间滤波两类; 2.灰度变换:在图像的但像素上操作,主要以对比度和 阈值处理为目的; 3.空间滤波:涉及改善性能的操作,如通过对像素的邻 ...
  • 目录说明 说明 本系列用于记录数字图像处理的学习笔记,课程为中国科学院大学焦建彬老师的数字图像处理 本篇为灰度变换与空间滤波
  • 数字图像处理第三版(冈萨雷斯)——第三章灰度变换与空间滤波(part1) 《数字图像处理 第三版》(冈萨雷斯)——第三章 灰度变换和空间滤波 数字图像处理第三版(冈萨雷斯)——第三章灰度变换与空间滤波(part2) ...
  • 灰度变换与空间滤波术语:空间域空间域处理的表示:术语:空间滤波器灰度变换(点处理技术)灰度变换函数线性函数对数函数伽马变换对比度拉伸变换函数阈值处理函数分段线性变换IPT提供的APIimadjuststretchlim灰度...
  • 灰度变换与空间滤波 空间域: 指图像平面本身,这类图像处理方法直接以图像中的像素操作为基础。操作分为灰度变换和空间滤波。 灰度变换: 在图像的单个像素上操作,以对比度和阈值处理为主要目的。 空间滤波: 设计...
  • 数字图像处理_图像灰度变换与空间滤波1. 实验目的2. 实验流程2.1 绘制图像直方图2.2 灰度变换2.3 直方图均衡化2.4 中值滤波2.5 自定义中值滤波函数3. 实验代码3.1 生成并绘制图像直方图3.2 灰度变换3.3 直方图均衡化...
  • 数字图像处理 知识总结前言空间域方法变换域方法2 灰度变换与空间滤波基础3 基于灰度变换的图像增强基本灰度变换函数图像反转对数变换幂律(伽马)变换分段线性变换函数对比度拉伸灰度级分层直方图处理直方图均衡化...
  • 灰度变换与空间滤波1.1.背景知识1.2.灰度变换函数1.2.1.imadjust和stretchlim函数1.2.2.对数及对比度扩展变换1.2.3.指定任意灰度变换1.2.4.针对灰度变换的某些公用M-函数1.3.直方图处理与函数绘图二级目录1.1.背景...
  • 第二章 灰度变换与空间滤波(续)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 501
精华内容 200
关键字:

灰度变换与空间滤波