精华内容
下载资源
问答
  • 常用的图像处理方法包括
    千次阅读
    2018-12-01 11:09:02

    一、基本的灰度变换函数
    1.1.图像反转
    适用场景:增强嵌入在一幅图像的暗区域中的白色或灰色细节,特别是当黑色的面积在尺寸上占主导地位的时候。

    1.2.对数变换(反对数变换与其相反)
    过程:将输入中范围较窄的低灰度值映射为输出中较宽范围的灰度值。
    用处:用来扩展图像中暗像素的值,同时压缩更高灰度级的值。
    特征:压缩像素值变化较大的图像的动态范围。
    举例:处理傅里叶频谱,频谱中的低值往往观察不到,对数变换之后细节更加丰富。

    1.3.幂律变换(又名:伽马变换)
    过程:将窄范围的暗色输入值映射为较宽范围的输出值。
    用处:伽马校正可以校正幂律响应现象,常用于在计算机屏幕上精确地显示图像,可进行对比度和可辨细节的加强。

    1.4.分段线性变换函数
    缺点:技术说明需要用户输入。
    优点:形式可以是任意复杂的。
    1.4.1.对比度拉伸:扩展图像的动态范围。
    1.4.2.灰度级分层:可以产生二值图像,研究造影剂的流动。
    1.4.3.比特平面分层:原图像中任意一个像素的值,都可以类似的由这些比特平面对应的二进制像素值来重建,可用于压缩图片。

    1.5.直方图处理
    1.5.1直方图均衡:增强对比度,补偿图像在视觉上难以区分灰度级的差别。作为自适应对比度增强工具,功能强大。
    1.5.2直方图匹配(直方图规定化):希望处理后的图像具有规定的直方图形状。在直方图均衡的基础上规定化,有利于解决像素集中于灰度级暗端的图像。
    1.5.3局部直方图处理:用于增强小区域的细节,方法是以图像中的每个像素邻域中的灰度分布为基础设计变换函数,可用于显示全局直方图均衡化不足以影响的细节的显示。
    1.5.4直方图统计:可用于图像增强,能够增强暗色区域同时尽可能的保留明亮区域不变,灵活性好。

    二、基本的空间滤波器
    2.1.平滑空间滤波器
    2.1.1平滑线性滤波器(均值滤波器)
    输出:包含在滤波器模板邻域内的像素的简单平均值,用邻域内的平均灰度替代了图像中每个像素的值,是一种低通滤波器。
    结果:降低图像灰度的尖锐变化。
    应用:降低噪声,去除图像中的不相关细节。
    负面效应:边缘模糊。

    2.1.2统计排序滤波器(非线性滤波器)
    举例:中值滤波器。
    过程:以滤波器包围的图像区域中所包含图像的排序为基础,然后使用统计排序结果决定的值取代中心区域的值。
    用处:中值滤波器可以很好的解决椒盐噪声,也就是脉冲噪声。

    2.2.锐化空间滤波器
    2.2.1拉普拉斯算子(二阶微分)
    作用:强调灰度的突变,可以增强图像的细节。

    2.2.2非锐化掩蔽和高提升滤波
    原理:原图像中减去一幅非锐化(平滑处理)的版本。
    背景:印刷和出版界使用多年的图像锐化处理。
    高提升滤波:原图减去模糊图的结果为模板,输出图像等于原图加上加权后的模板,当权重为1得到非锐化掩蔽,当权重大于1成为高提升滤波。

    2.2.3梯度锐化(一阶微分对)
    含义:梯度指出了在该位置的最大变化率的方向。
    用处:工业检测,辅助人工检测产品的缺陷,自动检测的预处理。

    三、基本的频率滤波器
    3.1.1理想低(高)通滤波器
    特性:振铃现象,实际无法实现。
    用处:并不实用,但是研究滤波器的特性很有用。

    3.1.2布特沃斯低(高)通滤波器
    特点:没有振铃现象,归功于在低频和高频之间的平滑过渡,二阶的布特沃斯低通滤波器是很好的选择。
    效果:比理想低(高)通滤波器更平滑,边缘失真小。截止频率越大,失真越平滑。

    3.1.3高斯低(高)通滤波器
    特点:没有振铃。
    用处:任何类型的人工缺陷都不可接受的情况(医学成像)。

    3.1.4钝化模板,高提升滤波,高频强调滤波
    用处:X射线,先高频强调,然后直方图均衡。

    3.1.5同态滤波
    原理:图像分为照射分量和反射分量的乘积。
    用处:增强图像,锐化图像的反射分量(边缘信息),例如PET扫描。

    3.1.6选择性滤波
    3.1.6.1带阻滤波器和带通滤波器。
    作用:处理制定频段和矩形区域的小区域。

    3.1.6.2陷阱滤波器
    原理:拒绝或通过事先定义的关于频率矩形中心的一邻域。
    应用:选择性的修改离散傅里叶变换的局部区域。
    优点:直接对DFT处理,而不需要填充。交互式的处理,不会导致缠绕错误。
    用途:解决莫尔波纹。

    四、重要的噪声概率密度函数
    4.1.高斯噪声
    特点:在数学上的易处理性。

    4.2瑞利噪声
    特点:基本形状向右变形,适用于近似歪斜的直方图。

    4.3爱尔兰(伽马)噪声
    特点:密度分布函数的分母为伽马函数。

    4.4指数噪声
    特点:密度分布遵循指数函数。

    4.5均匀噪声
    特点:密度均匀。

    4.6脉冲噪声(双极脉冲噪声又名椒盐噪声)
    特点:唯一一种引起退化,视觉上可以区分的噪声类型。

    五、空间滤波器还原噪声
    5.1均值滤波器
    5.1.1算术均值滤波器
    结果:模糊了结果,降低了噪声。
    适用:高斯或均匀随机噪声。

    5.1.2几何均值滤波器
    结果:和算术均值滤波器相比,丢失的图像细节更少。
    适用:更适用高斯或均匀随机噪声。

    5.1.3谐波均值滤波器
    结果:对于盐粒噪声(白色)效果较好,但不适用于胡椒噪声(黑色),善于处理高斯噪声那样的其他噪声。

    5.1.4逆谐波均值滤波器
    结果:适合减少或在实际中消除椒盐噪声的影响,当Q值为正的时候消除胡椒噪声,当Q值为负的时候该滤波器消除盐粒噪声。但不能同时消除这两种噪声。
    适用:脉冲噪声。
    缺点:必须知道噪声是明噪声还是暗噪声。

    5.2统计排序滤波器
    5.2.1中值滤波器
    适用:存在单极或双极脉冲噪声的情况。

    5.2.2最大值滤波器
    作用:发现图像中的最亮点,可以降低胡椒噪声。

    5.2.2最小值滤波器
    作用:对最暗点有用,可以降低盐粒噪声。

    5.2.3中点滤波器
    作用:结合统计排序和求平均,对于随机分布噪声工作的很好,如高斯噪声或均匀噪声。

    5.2.4修正的阿尔法均值滤波器
    作用:在包括多种噪声的情况下很有用,例如高斯噪声和椒盐噪声混合。

    5.3自适应滤波器
    5.3.1自适应局部降低噪声滤波器
    作用:防止由于缺乏图像噪声方差知识而产生的无意义结果,适用均值和方差确定的加性高斯噪声。

    5.3.1自适应中值滤波器
    作用:处理更大概率的脉冲噪声,同时平滑非脉冲噪声时保留细节,减少诸如物体边界粗化或细化等失真。

    5.4频率域滤波器消除周期噪声
    5.4.1带阻滤波器
    应用:在频率域噪声分量的一般位置近似已知的应用中消除噪声

    5.4.2带通滤波器
    注意:不能直接在一张图片上使用带通滤波器,那样会消除太多的图像细节。
    用处:屏蔽选中频段导致的结果,帮助屏蔽噪声模式。

    5.4.3陷阱滤波器
    原理:阻止事先定义的中心频率的邻域内的频率。
    作用:消除周期性噪声。

    5.4.4最佳陷阱滤波
    作用:解决存在多种干扰分量的情况。

    更多相关内容
  • 利用Python集成了20多常用图像处理方法包括二值化、边缘检测、开闭运算、高斯模糊、直方图等操作。仅需要读取图片便能运行,可在Python3环境下直接运行,无需调整。
  • 本书分三部分(遥感数字图像处理基础、遥感数字图像质量改善、遥感数字图像特征选择与信息提取)由浅入深系统地介绍了遥感数字图像处理的原理与方法,其中不仅包括常用的经典方法,也包括近几年新提出的方法。...
  • * 一读取图像 使用函数imread可以将图像读入MATLAB 环境其语法格式为 imread'filename) 其中filename是一个含有图像文件全名的字 符串 常用图像操作 * 当filename中不包含任何路径信息时imread会从当前目录中寻找并...
  • 图像处理与分析:变分、pde、小波及随机方法》首先介绍了对于现代图像分析和处理有重要意义的一般数学、物理和统计背景,包括曲线和曲面的微分几何、有界变差函数空间、统计力学的要素及其在图像分析中的含义、...
  • 数字图像处理——12种常用图像处理方法对比1.图像反转2.对数变换3.幂次变换4.分段函数5.直方图均衡化6.直方图规定化7.直方图匹配8.线性滤波9.中值滤波与均值滤波10.拉普拉斯锐化滤波11.Sobel 梯度算子 1.图像反转 2...

    1.图像反转

    在这里插入图片描述

    2.对数变换

    表达式为: s = c *log( 1 + r )
    c 是一个常数,假设 r ≥0
    使一窄带低灰度输入图像值映射为一宽带输出值;
    使低灰度范围得以扩展,高灰度范围得以压缩
    在这里插入图片描述

    3.幂次变换

    表达式为:s = c*r^γ
    其 中 c 和 γ 为正 常数
    幂次变换通过幂次曲线中的 γ 值把输入的窄带值映射到宽带输出值。
    当 γ <1 时,提高灰度级,使图像变亮
    当 γ > 1 时,降低灰度级,使图像变暗
    幂次变换用于对比度增强
    在这里插入图片描述

    4.分段函数

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

    5.直方图均衡化

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

    6.直方图规定化

    在这里插入图片描述
    图 © 是将图像 (A) 按图 (b) 的直方图进行规定化得到的结果及其直方图。通过对比可以看出图 © 的对比度同图( B) 接近一致,对应的直方图形状差异也不大。这样有利于影像拼接处理,保证拼接影像灰度差异小。

    7.直方图匹配

    在这里插入图片描述

    8.线性滤波

    在这里插入图片描述

    9.中值滤波与均值滤波

    均值滤波去噪时,会造成图像模糊
    中值滤波去噪时,能较好的保持图像边缘信息
    在这里插入图片描述

    10.拉普拉斯锐化滤波

    在这里插入图片描述

    11.Sobel 梯度算子

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • 本书分三部分(遥感数字图像处理基础、遥感数字图像质量改善、遥感数字图像特征选择与信息提取)由浅入深系统地介绍了遥感数字图像处理的原理与方法,其中不仅包括常用的经典方法,也包括近几年新提出的方法。...
  • 运用偏微分方程(PDE)方法进行图像处理的matlab程序,包括图像滤波、图像分割、插值、图像增强、恢复及一些方程组求解等在偏微分方法处理图像处理领域常用且重要的处理程序
  • 包含图像处理常用的几种滤波方法,有matlab代码和ppt讲解,包含均值滤波,中值滤波,高斯滤波,双边滤波,有示例演示。
  • 常用传统图像处理方法梳理

    千次阅读 2020-04-19 00:35:36
    图像滤波(1) 图像滤波(2) 图像增强——常见边缘检测算子2. HoG特征与SIFT特征(1) HoG(2) SIFT 特征3. 霍夫变换(1) 直线检测(2) 霍夫变换圆检测4. 开闭运算 腐蚀膨胀5. 插值 0. 颜色空间 常见颜色空间: RGB HSI...

    0. 颜色空间

    常见颜色空间:

    • RGB
    • HSI(色调、饱和度、明度)
    • YUV
    • CMYK

    OpenCV为什么是BGR?

    • 早期的bmp等图像格式中BGR更广泛一点,所以opencv也遵循这个格式

    • BGR与RGB格式转换

      img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
      # 或
      img_rgb = img[:,:,::-1] # 因为img[:,:,0]为b分量, img[:,:,1]为g,img[:,:,2]为r分量
      

      注:python的list中,listA[i:j:s],表示从i到j的左闭右开区间,s表示步长。

    • opencv中通道数是在最后面,也就是上面的不管rgb还是bgr都是[h,w,c]的格式,有时候需要将通道数放到前面,使用transpose方法

      img_channel_first = img.transpose((2,0,1))
      

    1. 图像滤波

    (1) 图像滤波

    • 图像噪声

      • 高斯噪声,噪声的概率密度函数服从高斯分布,一般来自于器件的热噪声、电路噪声;高斯白噪声,功率谱密度均匀分布(高斯滤波)
      • 椒盐噪声,亮暗点噪声(中值滤波)
      • 泊松噪声,概率密度函数服从泊松分布(泊松分布适合于描述单位时间内随机事件发生的次数的概率分布),一般也是由于器件的光电转换过程导致
      • 量化噪声
    • 滤波器

      (一般在计算模板的时候就对系数和进行归一化处理了,因此使用模板的时候只需要求加权和)

      • 高斯滤波器:根据高斯函数的形状来选择权值的线性平滑滤波器

      • 均值滤波:窗口下取均值

      • 中值滤波:窗口下取中位数

      • 双边滤波:非线性滤波,具有保持边缘、平滑降噪的功能。

        ​ 对一幅图像而言,边缘区域像素值变化快,而非边缘区域像素变化比较平坦。高斯滤波并没有对这两种区域加以区分,因此会导致边缘模糊。若要比较好的保留图像边缘,就必须引入一个变量去衡量当前像素变化的剧烈程度,所以双边滤波其实就是引入了这样一个图像像素域的核。原来的高斯滤波中就是一个空间域的核,它是一个二维的高斯函数;像素域核就是衡量像素变化剧烈程度的函数。它们俩共同作用的结果:在图像的平坦区域,像素值变化很小,对应的像素范围域权重接近于1,此时空间域权重起主要作用,相当于进行高斯模糊;在图像的边缘区域,像素值变化很大,像素范围域权重变大,从而保持了边缘的信息

        dst = cv2.bilateralFilter(src=image,d=0,sigmaColor=100,sigmaSpace=15)
        

        ​ 其模板权重的计算方法:先根据sigmaSpace核sigmaColor计算各自的高斯函数下的权重,然后在对应像素位置将二者的乘积作为模板权重。之后就是像一般的卷积那样像素值加权求和。

        ​ Ref:双边滤波原理

    (2) 图像增强——常见边缘检测算子

    • sobel

      边缘检测,边缘是像素值变化比较剧烈的位置,在连续函数上就是求梯度,在离散的数字图像上就是求差分。sobel算子就是求的水平或者竖直方向的一阶差分,同时带有一定的平滑效果。

      下图给出了两种sobel算子的功能。从本质上来看,上面这个sobel算子是水平差分+垂直平滑的结果,下面这个是水平平滑+垂直差分的结果。

      【优点】计算简单,速度快

      【缺点】计算方向单一,只有水平和垂直方向,难以应对复杂纹理;根据差分结果直接用单一阈值进行判断是否边缘像素,对有的噪声情况无法进行很好的处理

      img

    • canny

      虽然比较古老,但却是传统图像处理中,边缘检测的首选,性能很好。它主要包括以下四个步骤:

      • 高斯滤波,对图像进行平滑

      • 计算梯度大小和方向

        • 计算梯度大小,也使用类似sobel的梯度检测算子。它的模板系数计算方法是对高斯函数求梯度并标准化得到的,然后计算得到的也是水平和垂直两个方向的梯度大小

        • 计算梯度方向(角度)

          img

      • 利用非极大值抑制剔除上一步得到的梯度图像中大部分的非边缘点。这里的非极大值抑制思路主要为:如果一个像素点属于边缘,那么这个像素点在梯度方向上的梯度值是最大的。否则不是边缘,将灰度值设为0。如下图,梯度方向均为垂直向上,则取梯度方向上最大值为边缘点,这样理论上能够形成细且准确的单像素边缘

        img

      • 使用双阈值进行边缘连接。经过以上三步之后得到的边缘质量已经很高了,但还是存在很多伪边缘,因此Canny算法中所采用的算法为双阈值法,具体思路为选取两个阈值,将小于低阈值的点认为是假边缘置0,将大于高阈值的点认为是强边缘置1,介于中间的像素点需进行进一步的检查。具体实现的时候,根据高阈值图像中把边缘链接成轮廓,当到达轮廓的端点时,该算法会在断点的8邻域点中寻找满足低阈值的点,再根据此点收集新的边缘,直到整个图像闭合

      canny算子在opencv中的使用:

      dst = cv2.Canny(img, thresh1, thresh2) #两个threshold前者为低阈值,后者为高阈值
      

      Ref:https://zhuanlan.zhihu.com/p/59640437

    2. HoG特征与SIFT特征

    (1) HoG

    参考:HoG特征
    ① 对图像进行预处理,主要是伽马矫正和灰度化,尽量去除光照的影响
    ② 对原图中的每一点,计算其梯度值,得到其梯度的大小和方向
    例如,水平方向梯度gx:做水平差分;竖直方向梯度gy:做竖直差分。
    总的梯度大小g = sqrt(gx2+gy2)
    总的梯度方向θ = arctan(gx/gy)
    ③ 计算梯度直方图
    将8x8大小的区域划分为一个cell,其元素共有8x8x2=128个关于梯度的值,将其按角度分到9个bin中,这9个bin是将180度划分为9份得到。这样,就得到一个长度为9的数组(梯度的直方图)。一般来说,观察梯度方向的主要分布范围,就可以大致认为该8x8区域的具有某个方向的边缘。HoG是对边界敏感,对灰度变化平坦的区域不敏感。

    img

    img

    ④ 以4个cell为一个block进行归一化,进一步降低光照影响
    一个block事实上对应16x16的区域。4个cell,每个cell经过梯度直方图计算已经转化为一个长度为9的vector,现在一个block相当于包含一个长度为4x9=36的vector。这里的归一化,就是对这个长度为36的向量进行归一化

    img

    ⑤ 得到HoG特征向量
    注意block是在整张图上滑动的,因此对于64x128的图像,共7x15个block。
    因此一张图像的HoG向量为7x15x36 = 3780
    得到HoG特征向量之后,一般用svm进行分类。

    (2) SIFT 特征

    SIFT全称为scale invariant feature transform,即尺度不变特征变换。SFIT特征对于旋转、缩放、亮度等具有较好的不变性。

    • 特点

      • 描述图像的局部特征,能够对旋转(生成特征描述子时进行主方向校正)、尺度(通过差分高斯金字塔保证)、亮度(通过特征归一化保证)等保持不变,同时对视角变化、仿射变换、噪声等也具有一定的鲁棒性。
      • 独特性好,信息量丰富,适用于海量特征库进行快速、准确的匹配。
      • 多量性,即使是很少几个物体也可以产生大量sift特征
      • 高速,经优化的sift匹配算法能够达到实时效果
      • 可以很方便的与其他特征向量联合
    • 4个主要步骤

      • 尺度空间的极值检测,搜索潜在的感兴趣点
      • 特征点的精确定位
      • 特征方向赋值
      • 特征点描述【重点】
    • 尺度空间的极值检测

      为了搜索潜在的感兴趣点(特征点),由于这样的点应该在不同尺度、不同模糊程度上,先要求解差分高斯图像。

      首先,对原图像进行不同程度的高斯模糊,方差倍增,构成高斯尺度金字塔;对该金字塔的每一个图像进行一组等比例的下采样,得到不同空间尺度下的高斯尺度金字塔。

      然后,对于同一个高斯尺度金字塔内的各个图像,它们之间的区别主要是高斯模糊的程度不同,为了检测出在不同模糊情况下都存在的特征点,较好的做法是使用高斯拉普拉斯算子(LoG),但是它计算量比较大,这里采用差分高斯(DoG)来替代。其计算方法简单,如下:
      在这里插入图片描述
      也就是说,将两个相邻的不同模糊程度的高斯空间的图像相减,就得到了差分高斯的响应图像。(k表示相邻两图的高斯方差成k倍)。将同一组内相邻的图像两两相减,就得到了差分高斯金字塔

      接下来,为了寻找极值点,同一个金字塔内,每个像素点要和其图像邻域(物理意义上相邻的像素)和尺度邻域(相邻高斯尺度空间)的所有相邻点进行比较,当它大于/小于所有相邻点时,这个点就是极值点。见下图,所有绿色点都是x点的“相邻点”。

      极值检测

      尺度变化连续性【待理解】:DoG金字塔每组首末两张图像无法比较求极值,这里有一点特殊处理。见参考文献。

    • 特征点的精确定位(对不好的特征点进行剔除)

      SIFT特征提取的关键点是DoG图像邻域(包括高斯尺度邻域和图像邻域)像素值的极值点(DoG做了差分,自身的像素值已经表示梯度了)。

      但DoG的局部极值点是在离散空间搜索得到的,不一定是真正意义上的极值点。因此需要将不满足条件的点剔除。可以通过尺度空间DoG函数进行曲线拟合来寻找极值点,其本质是对DoG局部曲率非常不对称的点进行剔除。这一步主要去除的是对比度低于一定阈值的特征点以及不稳定的边缘相应点(通过检测主曲率来实现)

    • 求取特征点的主方向(与HoG特征求解思路相同)

      经过上面的步骤,找到了在不同尺度下都存在的特征点,为了实现图像的旋转不变性,需要对特征点的方向进行赋值。对某个特征点,可以确定其对应的高斯尺度图像,计算以该特征点为中心、3×1.5倍标准差范围内各个点的梯度大小和方向角:在这里插入图片描述
      可以将[0,360°]划分为10个范围,按梯度方向角的大小统计梯度直方图(每个范围内的梯度累加),直方图的峰值即为特征点的主方向(实际中,应该还有平滑和插值拟合等操作)。

      在梯度直方图中,当存在一个相当于主峰值80%能量的柱值时,则可以将这个方向认为是该特征点辅助方向。所以,一个特征点可能检测到多个方向(也可以理解为,一个特征点可能产生多个坐标、尺度相同,但是方向不同的特征点)

      Lowe在论文中指出:15%的关键点具有多方向,而且这些点对匹配的稳定性很关键

      得到特征点的主方向后,对于每个特征点可以得到三个信息(x,y,σ,θ),即位置、尺度和方向。由此可以确定一个SIFT特征区域,一个SIFT特征区域由三个值表示,中心表示特征点位置,半径表示关键点的尺度,箭头表示主方向。具有多个方向的关键点可以被复制成多份,然后将方向值分别赋给复制后的特征点,一个特征点就产生了多个坐标、尺度相等,但是方向不同的特征点

    • 生成特征描述

      通过上面的步骤已经得到了SIFT特征点的位置、尺度(个人理解为高斯模糊程度)和方向信息,下面需要用一组向量来对关键点进行描述。这组向量既包含了特征点本身的信息,也包含了特征点周围对他有贡献的其他像素点的信息。描述子应具有较高的独立性,以保证匹配率。

      SIFT特征描述子的生成包含以下三个步骤:

      • 校正旋转主方向,确保旋转不变性
      • 生成描述子,为一个128维特征向量
      • 对特征向量进行归一化,进一步去除光照影响

      校正旋转主方向,是为了保持特征向量的旋转不变性。这里的实现方法为:以特征点为中心,在其邻域内将坐标轴旋转到特征点主方向上,旋转后邻域内像素的新坐标为:
      在这里插入图片描述
      接下来,以特征点为中心,选取其周围16×16的像素,每4×4个划分为一组;求得每个像素的梯度大小和方向后,在4×4窗口内统计梯度直方图,这里将[0,360°]划分为8个方向,因此每个4×4窗口产生一个8维向量;而一共有16个窗口,因此每个特征点产生一个128维向量(这里的16个窗口,是16个直梯度直方图,相当于特征点周围的16个种子点,每个种子点有8个方向的信息)。

      这种邻域方向性信息联合增强了算法的抗噪声能力,同时对于含有定位误差的特征匹配也提供了比较理性的容错性。 这里写图片描述

    Ref:SIFT特征原理

    3. 霍夫变换

    霍夫变换是对canny等算子处理后的边缘图像,求解图中的直线、圆等目标。其基本思路为:将特定图像上的点变换到一组参数空间上,根据参数空间中点的累计结果,找到一个极大值对应的解,那么这个解就对应着我们要寻找的几何形状的参数(如直线的斜率和截距、圆的圆心和半径)

    因此,关键在于找到这个参数空间,然后对其进行统计。

    (1) 直线检测

    假设有一条直线L,原点到该直线的垂直距离为p,垂线与x轴夹角为θ ,那么这条直线是唯一的,且直线的方程为 ρ=xcosθ+ysinθ

    img

    该直线上的所有点都只有满足一组唯一的共同参数(ρ,θ),这个(ρ,θ)决定的直线就是检测到的直线。尽管对于每个点自身而言,可以对应许多(ρ,θ),因为一个点可以出现在多条直线上。

    因此,对于每个点,我们去求解它所在直线的可能值,能够获得一系列(ρ,θ)参数,将一系列参数画在极坐标上,见下面右图。右图上的每一个点,对应直角坐标系上的一条直线

    img

    而对于原直线上的每一个点,都可以在参数空间画出这么一个曲线,接下来只需要统计在参数空间中这些曲线主要相交在哪个点,这个点对应的(ρ,θ)就是原空间中直线的参数。

    img

    因此霍夫变换直线检测的步骤如下:

    • 对原图使用canny算子等方法进行边缘提取
    • 将参数空间(ρ,θ) 量化,赋初值一个二维矩阵M,M(ρ,θ) 就是一个累加器了
    • 对图像边界上的每一个点进行变换,变换到属于哪一组(ρ,θ) ,就把该组(ρ,θ) 对应的累加器数加1。具体为,给定 θ i θ_i θi,根据 ρ i = x c o s θ i + y s i n θ i ρ_i=xcosθ_i+ysinθ_i ρi=xcosθi+ysinθi计算出 ρ i ρ_i ρi,然后将M( ρ i ρ_i ρi,$ θ_i $)处的值+1。
    • 所有点处理完后,找到M矩阵上大于阈值T的点,这些点的参数值就对应原空间的一条直线。

    霍夫变换直线检测的问题:

    • Hough变换进行参数空间映射时需要对每个边缘点进行多次正弦曲线计算,这就大大的加重了算法的计算负担,同时也降低了其实时性
    • 在进行Hough变换之前需要对参数空间进行量化与离散化,但在离散化之后,参数空间中本来连续的函数被离散函数所取代,这就造成了变换之后得到的(A巧的值与原有值之间存在一定的误差
    • 上述方法对于参数空间中的离散点只进行一次投票,而在一次投票过程中常常出现伪峰值被判定为目标直线的情况。这点明显的不足严重的制约了其适用范围

    改进:

    • 不采用计数器+一次投票确定参数,而在计算完毕参数空间后,采用聚类算法,确定聚类中心。

    (2) 霍夫变换圆检测

    与直线检测类似,不过圆检测的参数空间是个三维空间(a,b,r),分别对应圆心坐标和半径。对于圆上的每一点,满足

    ​ $ (x-a)2+(y-a)2=r^2 $

    因此同样对其参数空间进行计数统计,找到满足点数最多的圆参数。

    霍夫变换圆检测的缺点:

    • 需要将参数空间离散为一个三维空间(a,b,r),送样就使得算法所需的计算时间与存储空间过大,这一问题严重制约了该算法在实际检测中的应用
    • 该算法需要对圆形的半径进行提前预判,这就导致检测过程中可能出现漏检、误检的可能,这也降低了该算法对于圆形提取的精确性

    优化方案:

    • 在OpenCV的霍夫圆检测函数实现中,为提升速度,采用的并非是直接对三个参数进行投票,而是另外一种通过计算梯度来对两侧可能出现圆心的位置进行投票的方法。具体可以查看该函数的实现。

    一些观点

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yFyfx8Ye-1587227089216)(C:\Users\LUO YUJIE\AppData\Roaming\Typora\typora-user-images\image-20200407180059250.png)]

    • 霍夫变换直线检测这样的传统图像处理方法怎么与深度学习方法结合起来?
      • 作为图像预处理,平滑去噪、光线校正、畸变校正、变换等
      • 作为数据增强手段,各种增强,噪声,变形
      • 作为后处理手段,比如先通过目标检测分割出目标区域,然后再做霍夫变换直线检测(参考这个:https://zhuanlan.zhihu.com/p/77666653)

    4. 开闭运算 腐蚀膨胀

    待更新

    5. 插值

    待更新

    展开全文
  • 常见图像处理技术

    千次阅读 2022-02-20 01:15:09
    点击上方“小白学视觉”,选择加"星标"或“置顶”重磅干货,第一时间送达本期文章中,让我们一起来学习以下内容。通过PIL和OpenCV来使用一些常见图像处理技术,例如将RGB图像转换为灰度...

    点击上方“小白学视觉”,选择加"星标"或“置顶

    重磅干货,第一时间送达b28ee095a0367e0ba84fe9ba9d7dc6cb.png

    本期文章中,让我们一起来学习以下内容。

    • 通过PIL和OpenCV来使用一些常见的图像处理技术,例如将RGB图像转换为灰度图像、旋转图像、对图像进行消噪、检测图像中的边缘以及裁剪图像中的感兴趣区域。

    • 使用OpenCV中的模板匹配搜索图像中的对象。

    所需安装的库:PIL、OpenCV、imutils

    为什么我们需要学习图像处理技术?

    深度学习对于图像的分析、识别以及语义理解具有重要意义。“图像分类”、“对象检测”、“实例分割”等是深度学习在图像中的常见应用。为了能够建立更好的训练数据集,我们必须先深入了解基本的图像处理技术,例如图像增强,包括裁剪图像、图像去噪或旋转图像等。其次基本的图像处理技术同样有助于光学字符识别(OCR)。

    图像处理技术通过识别关键特征或读取图像中的文本信息,来提高图像的可解释性,以便对图像中存在的对象进行分类或检测。

    1190301e667bd7d9d2504d9b7e333d67.png

    图片来源于Unsplash

    此处提供代码和图像

    导入所需的库

    import cv2
    from PIL import Image

    首先我们使用OpenCV和PIL显示图像

    使用OpenCV读取和显示图像

    image = cv2.imread(r'love.jpg')
    cv2.imshow("Image", image)
    cv2.waitKey(0)

    如果图像太大,图像的窗口将不匹配屏幕显示比例。

    那么如何在屏幕上显示完整的图像?

    默认情况下,显示超大图像时图像都会被裁剪,不能被完整显示出来。为了能够查

    看完整图像,我们将使用OpenCV中的namedWindow(name, flag)来创建一个新的显示图像窗口。

    第一个参数name是窗口的标题,将被用作标识符。 当您将flag设置为cv2.WINDOW_NORMAL时,将显示完整图像,并可以调整窗口大小。当然flag参数还有选择。

    image = cv2.imread(r'love.jpg')
    cv2.namedWindow('Normal Window', cv2.WINDOW_NORMAL)
    cv2.imshow('Normal Window', image)
    cv2.waitKey(0)

    调整图像的尺寸

    当我们调整图像大小时,我们可以更改图像的高度或宽度,或在保持宽高比不变的情况下同时变化高度和宽度。图片的宽高比是图片的宽度与高度的比。

    image= cv2.imread(r'taj.jpg')
    scale_percent =200 # percent of original size
    width = int(image.shape[1] * scale_percent / 100)
    height = int(image.shape[0] * scale_percent / 100)
    dim = (width, height)
    resized = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
    cv2.imshow("Resize", resized)
    cv2.waitKey(0)

    使用PIL读取和显示图像

    我们将使用open()加载图像,然后使用show()进行显示。

    使用image.show()创建一个临时文件

    pil_image= Image.open(r'love.jpg')
    pil_image.show("PIL Image")

    如果我们对图像中目标的边缘或其他特征感兴趣,要如何对他们进行识别呢?

    灰度图像常常用于识别目标物体的边缘,因为灰度图像不仅助于理解图像中对比度、阴影渐变,而且有助于理解图像特征。

    与灰度图像的2D通道相比,RGB图像具有三个通道:红色,绿色和蓝色。与彩色图像相比,灰度图像每个像素的信息更少,因此灰度图像的处理时间将更快。

    使用OpenCV对彩色图像进行灰度缩放

    以下是使用cvtColor()将彩色图像转换为灰度图像的方法及转换结果。

    image = cv2.imread(r'love.jpg')
    gray_image= cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    cv2.namedWindow('Gray Image', cv2.WINDOW_NORMAL)
    cv2.imshow('Gray Image', gray_image)
    cv2.waitKey(0)

    d3a9a06bf886285098be436e5fe912d4.png

    完成转换的灰度图

    使用PIL对彩色图像进行灰度缩放

    convert()提供了此图像转换的另一种方式, “ L”模式用于转换为灰度图像,“ RGB”模式用于转换为彩色图像。

    pil_image= Image.open(r'love.jpg')
    gray_pil=pil_image.convert('L')
    gray_pil.show()

    使用OpenCV进行边缘检测

    我们将使用Canny算子对图像中的边缘进行检测。Canny边缘检测是通过灰度图像,使用高阶算法完成的。

    Canny():第一个参数是输入图像,第二个和第三个参数是阈值1阈值2的值。

    强度梯度大于threshold2的边缘被视为边缘,低于threshold1的边缘被视为非边缘。非边缘将被删除。两个阈值之间的任何梯度强度值都根据它们的连通性被分类为边缘或非边缘。

    image= cv2.imread(r'taj.jpg')
    cv2.namedWindow("Edge", cv2.WINDOW_NORMAL)
    denoised_image = cv2.Canny(image, 100,200 )
    cv2.imshow("Edge", denoised_image)
    cv2.waitKey(0)

    4436dcc40de49d24d9093a4357cc8cb8.png

    Canny边缘处理

    如果图像发生一定的倾斜或旋转,应该怎样进行调整?

    OCR对倾斜文本的提取效果不佳,因此我们需要对原图像进行校正。可以使用OpenCV和PIL中的rotate()对图像进行角度校正。

    使用OpenCV旋转图像

    rotate()会依据函数中的第二个参数rotationCode的值来旋转图像。

    旋转参数值有以下几种:

    • cv2.ROTATE_90_CLOCKWISE

    • cv2. ROTATE_90_COUNTERCLOCKWISE

    • cv2.ROTATE_180

    image = cv2.imread(r'love.jpg')
    cv2.namedWindow("Rotated Image", cv2.WINDOW_NORMAL)
    rotated_img= cv2.rotate(image,cv2.ROTATE_90_CLOCKWISE )
    cv2.imshow("Rotated Image", rotated_img)
    cv2.waitKey(0)

    b2f01d514b8ed756017be2d83c0b732a.png

    使用OpenCV将图像顺时针旋转90度

    如果我们想将图像旋转特定角度怎么办?

    根据特定角度旋转图像

    在下面的代码中,图像以60度为增量旋转

    使用 imutils中的rotate()

    import imutils
    import numpy as npimage = cv2.imread(r'love.jpg')# loop over the rotation angles
    for angle in np.arange(0, 360, 60):
        cv2.namedWindow("Rotated", cv2.WINDOW_NORMAL)
        rotated = imutils.rotate(image, angle)
        cv2.imshow("Rotated", rotated)
        cv2.waitKey(0)

    c2d429c9390b312afd016664b373c086.png

    使用imutils以60度为增量旋转图像

    使用PIL旋转图像

    此处使用PIL将图像旋转110度

    pil_image= Image.open(r'love.jpg')
    rotate_img_pil=pil_image.rotate(110)
    rotate_img_pil.show()

    dbea5ca750d061795801a5cd09643d0b.png

    使用PIL将图像旋转110度

    当图像因噪声而变差并影响图像分析时,我们应该如何提高图像质量?

    使用OpenCV对图像进行除噪

    噪声并不是我们想得到的信号,就图像而言,它会使图像受到干扰而失真。

    使用OpenCV最小化图像中出现的噪声,首先输入含有噪声的图像

    image= cv2.imread(r'taj.jpg')
    cv2.namedWindow("Noised Image", cv2.WINDOW_NORMAL)
    cv2.imshow("Noised Image", image)
    cv2.waitKey(0)

    29de7a127229521227e1c9570f028e5b.png

    OpenCV有多种方法可以消除图像中的噪点。我们将使用cv.fastNlMeansDenoisingColored(),来消除彩色图像中的噪点。

    fastNIMeansDenoising函数的常见参数:

    • src: 源图像

    • dst: 输出与src具有相同大小和类型的图像

    • h: 调节过滤器强度。 较高的h值可以完全消除噪点和图像细节,较小的h值可以保留图像细节以及一些噪点。

    • hForColorComponents: 与h相同,但仅用于彩色图像,通常与h相同

    • templateWindowSize: 默认0(推荐7)

    • searchWindowSize: 默认0(推荐21)

    image= cv2.imread(r'taj.jpg')
    cv2.namedWindow("Denoised Image", cv2.WINDOW_NORMAL)
    denoised_image = cv2.fastNlMeansDenoisingColored(image,None, h=5)
    cv2.imshow("Denoised Image", denoised_image)
    cv2.waitKey(0)

    如何从图像中提取某些感兴趣的区域?

    裁剪图像

    裁剪图像可让我们提取图像中的兴趣区域。

    我们将裁剪泰姬陵的图像,从图像中删除其他细节,使图像仅保留泰姬陵。

    使用OpenCV裁剪图像

    在OpenCV中裁剪是通过将图像数组切成薄片来进行的,我们先传递y坐标的起点和终点,然后传递x坐标的起点和终点。

    image[y_start:y_end, x_start:x_end]

    image= cv2.imread(r'taj.jpg')
    resized_img= image[15:170, 20:200]
    cv2.imshow("Resize", resized_img)
    cv2.waitKey(0)

    使用PIL裁剪图像

    PIL的crop()允许我们裁剪图像的矩形区域。crop()的参数是矩形左上角和右下角的像素坐标。

    pil_image = Image.open(r'taj.jpg')
    
    
    # Get the Size of the image in pixels 
    width, height = pil_image.size
    
    
    # Setting the cropped image co-ordinates
    left = 3
    top = height /25
    right = 200
    bottom = 3 * height / 4
    
    
    # Crop the  image based on the above dimension 
    cropped_image = pil_image.crop((left, top, right, bottom))
    
    
    # Shows the image in image viewer 
    cropped_image.show()

    模板匹配

    我们可以提供模板和OpenCV中的matchTemplate()在图像中搜索该模板并提取其位置。

    这个模板会像卷积神经网络一样在整个图像上滑动,并尝试将模板与输入图像进行匹配。

    minMaxLoc()用于获取最大值/最小值,它是通过矩形的左上角开始沿着宽度和高度获取值。

    模板匹配有6种方法:

    • cv2.TM_SQDIFF

    • cv2.TM_SQDI

    • cv2.TM_C

    • cv2.TM_CCORR_NORMED

    • cv2.TM_CCOEFF

    • cv2.TM_CCOEFF_NORMED

    在下面的示例中,我们将从主图中裁剪一小部分创建模板。

    用于模板匹配的方法是TM_CCOEFF_NORMED。匹配的阈值设置为0.95。当匹配概率大于0.95时,该函数将会在与该匹配相对应的区域周围绘制一个矩形。

    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    img = cv2.imread(r'love.jpg',0)cv2.imshow("main",img)
    cv2.waitKey(0)template = cv2.imread(r'template1.png',0)
    cv2.imshow("Template",template)
    cv2.waitKey(0)w, h = template.shape[::-1]
    methods = [ 'cv2.TM_CCOEFF_NORMED']for meth in methods:
    
    
        method = eval(meth)# Apply template Matching
        res = cv2.matchTemplate(img,template,method)
        min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
        threshold=0.95
        loc=np.where(res>threshold)
        if len(loc[0])>0:# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
            if method in [ cv2.TM_SQDIFF_NORMED]:
                top_left = min_loc
            bottom_right = (top_left[0] + w, top_left[1] + h)cv2.rectangle(img,top_left, bottom_right,100,20)plt.subplot(121),plt.imshow(res,cmap = 'gray')
            plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
            plt.subplot(122),plt.imshow(img,cmap = 'gray')
            plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
            plt.suptitle(meth)plt.show()
        else:
            print("Template not matched")

    6ab1163c751300c73b2634ebbf394cdd.png

    结论

    我们所讨论的最常见图像处理技术可用于分析图像,例如图像分类,目标检测以及OCR。

    下载1:OpenCV-Contrib扩展模块中文版教程

    在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

    下载2:Python视觉实战项目52讲

    在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

    下载3:OpenCV实战项目20讲

    在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

    交流群

    欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

    23291284492663969c1bc6ee8d93cf76.png

    423ae3771e58214337c4681af17b90f5.png

    展开全文
  • 传统图像处理方法实现目标识别一系列流程
  • OpenCV3.2 Java图像处理视频培训课程:基于OpenCV新版本3.2.0详细讲述Java OpenCV图像处理部分内容,包括Mat对象使用、图像读写、 基于常用核心API讲述基本原理、使用方法、参数、代码演示、图像处理思路与流程讲授...
  • 一文概括常用图像处理算法

    千次阅读 2021-12-10 18:58:26
    本文总结了11种常用图像处理算法,包含了预处理算法以及检测算法,并介绍了一些常用的开发库。 一、算法(预处理算法、检测算法)在采集完图像后,首先会对图像进行预处理操作。1、图像变换(空域与频域、几何变换...
  • 俗话说:“好记性不如烂笔头”,多写写多记记,总不会错。多一些不为什么的坚持,少一些功利主义的追求。今天介绍图像处理的经典操作。本内容参考自《实用MATLAB图像和视频处理》第一章。
  • 形态学图像处理

    2017-10-18 11:24:08
    编程实现二值图像和灰度图像的几种常用的形态学处理方法包括:腐蚀、膨胀、开运算和闭运算。使用MFC完成界面编程,程序中包括:打开图像,显示图像,保存图像,参数输入和处理图像功能。
  • 这些模块涉及到较多图像处理知识,通过每个模块设计的实例,循序渐进的让初学者加深理解图像处理方法间的联系,激发初学者对图像处理的兴趣。软件用途:本课题针对图像处理的难点,设计了一款界面友好的图像处理仿真...
  • 图像处理 --- 一、认识图像处理

    千次阅读 2021-06-27 22:38:52
    一幅图像包含的信息首先表现为光的强度(intensity),即一幅图像可看成是空间各个坐标点上的光强度 I 的集合,其普遍数学表达式为: I = f(x,y,z,λ,t) 式中: (x,y,z)表示空间坐标, λ 表示波长, t 表示...
  • 秉承“独特、灵活和强大”的口号和“性能、创新、不冗余”的开发设计原则,采用完全不同的图像编辑方法,旨在为那些敢于梦想的人开辟新的可能性,Chasys Draw IES包含图像处理、图像转换以及图片浏览三大功能模块,...
  • 图像处理的几种方法

    千次阅读 2018-12-17 09:09:41
    图像处理的几种方法 1.使用skimage name details name details name details astronaut 宇航员图片 coffee 一杯咖啡图片 lena lena图片 camera 拿相机的人图片 ...
  • 图像处理与分析——变分,PDE,小...本书讨论四种最常见图像处理任务如图像降噪、图像去模糊、图像修复或插值以及图像分割的建模和计算,这些实际的图像处理任务在统一的数学框架下能够得到完整的分析和深入的理解。
  • 1.Introduction 因为最近复现实验需要对人脸框图像...对比的方法包括: opencv:cv2.resize。 matlab中的resize方法:这里直接使用github上公布的python版本。 PIL:Image.resize PIL,仍旧是Image.resize,加上反
  • 在数字图像处理过程中,输入的是质量低的图像,输出的是改善质量后的图像, 常用图像处理方法有图像增强、复原、编码、压缩等。 MATLAB既是一种直观、高效的计算机语言,同时又是一个科学计算平台。它为数据分析和...
  • 图像处理中的几种预处理方式

    千次阅读 2021-10-28 11:14:25
    归一化操作常用于图像预处理,它就是把你要处理图像数据经过某种算法处理后限制在一定的范围。归一化具有如下作用: (1)图像归一化可以统一输入样本数据的分布性,如归一化的[0,1]区间样本满足概率分布,归一化...
  • 数字图像处理——图像锐化

    千次阅读 2022-03-23 11:07:32
    对主要的图像锐化算法进行了介绍。
  • 图像处理设计主要有以下几种处理:图像增强(灰度变换、直方图增强、空间域滤波、频率域滤波)、图像分割、图像配准等等。 图像增强: 图像增强作为基本的图像处理技术,目的在于通过对图像进行加工使其比原始图像...
  • 书中包含许多常用图像处理子程序,故也可作为图像处理的程序库使用。 第1章 绪论 1.1 数字图像与图像处理 1.1.1 图像 1.1.2 数字图像 1.1.3 图像处理的主要内容 1.1.4 图像处理的应用 1.2 颜色模式 1.2.1 ...
  • 图像处理常见方法

    千次阅读 2015-06-28 09:52:38
    一、图像去噪方法 1.噪声类型 常见的有加性噪声和乘性噪声,加性噪声包括高斯噪声,椒盐噪声等。...分为两类,空间域方法,采用各种图像平滑模板对图像进行卷积处理;频率域方法,通过对图像进行变换后,选用适当
  • 不同图像的噪声,选用什么滤波器去噪,图像处理的噪声和处理方法 提示:据说是科大讯飞的算法面试题 知道哪些噪声,分别用什么滤波器处理? 文章目录 不同图像的噪声,选用什么滤波器去噪,图像处理的噪声和处理方法...
  • Python图像处理

    千次阅读 2022-06-11 23:35:48
    python图像处理

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 211,452
精华内容 84,580
热门标签
关键字:

常用的图像处理方法包括