欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)

程序员文章站 2022-07-15 12:00:53
...

简介

对于主攻计算机视觉的我们来说,对图片处理几乎时时刻刻都在进行。但在复现了几个网络后,我开始对整个网络过程中,图片到底是怎么变换的产生好奇。因此,在实验室中借阅了本相关的书籍(《Opencv算法精解-基于Python与C++》),通过一段时间的学习,整理。总算大致了解了图片在计算机上的各种转换过程。尤其在学习完之后,原来如此之情油然而生。因此,在这里,希望研究本方向的其他同学(特指入门者,资深学者请忽略)能先了解图片的原理之后,再开始入门深度学习。为方便大家,我在此做了一些总结,可以省去大部分时间,以及有些书籍中的opencv版本过低,某些算法已经改变。希望本篇博客能给大家带来帮助,也欢迎大家指出问题。

目录

  • Opencv简介
  • 图像数值化
  • 几何变化
  • 对比度增强
  • 图像平滑
  • 阈值分割
  • 形态学处理

对比度增强

简介

前面我们已经知道了,图像就是由无数个灰度值组成的,那么图像上是否清晰,其实就转变成了灰度值之间的据对峙大小的程度,相差越大,则图像越清晰。

接下来看个基本例子:

灰度直方图

使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
横坐标为256个灰度值,纵坐标为该数值下的灰度值个数,接下来让我们做一下基本变化

变换原理
图像就是矩阵,这样的话,我们直接通过矩阵的运算改变其灰度值。
使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
前面的变换,其实都是基于坐标,而不改变灰度值,而这里的变化,则是改变的灰度值,并没有改变坐标,也就是进行初等变换,乘除加减等

基本变换

  • 线性变换:设置一个线性函数,从而改变灰度值
    正规化:通过将 输入图像的灰度值最大距离 与 输出图像的最大距离 的比值作为系数(k),当前的灰度值与最小灰度值的差作为变量(x),再将输出图像的最小灰度值作为变化范围(b) ,通过图像本身决定系数,而不再是人为设置
    正规化函数:normalize(),里面可选择img的范数,从而改变系数的不同。(1-范数(绝对值的和),2-范数(平方和的开方)等)

  • 非线性变换

伽马变换:将灰度值归一化(除以255),之后进行幂运算。指数小于1时:增加对比度(暗区域感兴趣),指数大于1时,降低对比度(亮区间感兴趣)。
均衡化:计算直方图后,对直方图累加求和得到累加直方图,根据累加直方图找到关系。
限制对比度的自适应直方图均衡化:通过划分为不同区域块,然后分别均衡化,如果有噪声超过限制值,则裁剪,并且将多处的部分分配给其他块。

现在我们已经知道了变换的原理,但我们改变的都是整体,所以需要我们找到一个阈值,从而增加对比度,所以最主要的问题是如何找到阈值。简单来说,就是不同的灰度值,对应不同的变换,首先想到的就是函数

最简单的:

Img=img*2

使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
为什么×2之后,会出现某些灰度值出现0?其实回想原理,图像的储存使uint8,也就是说,超过256后,会通过取模而得到小于255的值。如:244*2=488,(按规定,不能超过255)则488%255=233,但是我们改变类型的话,则不会出现这种情况,如:float

改变类型之后的灰度值
使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
仔细看横坐标的变换,不再是原来的255,这就说明此时的图像类型已经改变,不再是uint8,此时已经变成float类型,也就是前面说过的32bit等,此时的色阶更细致

分段变换
使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
设置一个阈值,从而进行不同的操作

正规化
使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
其他例子就不一一展示了,可以去自己尝试。不过对图像的对比度提升效果显著,不过也可能也会造成一定的噪声,如何去除,会在后面的图像平滑补充。

图像平滑

简介

去除由灰度值随机变化而造成的噪点

二维离散卷积

  • Full卷积:无论边界,对每一个值进行卷积,(边界外取0),(处理后,图像变大)
  • Vaild卷积:对边界处的值无运算,只运算包含在填充了卷积的值 (处理后,变小)
  • Same卷积:通过定义锚点,进行运算 (处理后,保持原大小)

使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)

边界补充

常用方式
边界补充常数,通常为0
重复边界的值进行补充
卷绕输入矩阵,矩阵的平铺
镜像处理

函数:
Cv2.copyMakeBorder(img,top,bottom,left,right,borderType,value)
borderType:
BORDER_REPLICATE:边界复制
BORDER_CONSTANT:常数补充
BORDER_REFLECT:反射补充
BORDER_REFLECT_101:边界为中心补充
BORDER_WRAP:平铺补充

使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
卷积的过程
Convoluted2d(img,kernel,mode = ‘full’,boundary=‘fill’,fillvalue=0)
Mode :卷积类型,full,vaild,same
Boundary :边界补充方式

卷积前
使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
卷积后

使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
可分离卷积
通过分离卷积,将其变成分别为垂直,水平方向的卷积,从而进行运算

图像平滑,除噪

  • 高斯平滑:通过高斯卷积算子进行运算。Cv2.getGaussianKernel(ksize,sigma,ktype)
  • 均值平滑:构造全为1的卷积,之后除以元素总个数
  • 快速均值平滑:通过该点领域的和除以该点领域的面积。面积可由图像的积分计算(左上角的所有和)
  • 中值平滑:对领域的值进行排序,取中间值。medianBlur(img,ksize)

使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)

阈值分割

简介

所谓的二值化,灰度值只有0,1

方法概述

  • 全局阈值分割:设置阈值,全局划分。Cv2.threshold(img,thresh,maxval,type)
  • 局部阈值分割:对应每一个坐标的值阈值不同

阈值选取

  • 直方图技术:通过查找波谷,确定阈值
    Otsu阈值
  • 自适应阈值:利用平滑结果的矩阵作为阈值:cv2.adaptiveThreshold(img,255,adaptiveMethod(平滑类型),thresholdType,blockSize,c)

注:因为为二值图,因此可以做逻辑运算。

Otsu

使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)

自适应阈值

使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)

逻辑“非”

使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)

形态学处理

简介

  • 腐蚀:卷积内取最小值
  • 膨胀:卷积内取最大值
  • 开:先腐蚀再膨胀,去除亮点
  • 闭:先膨胀再腐蚀,去除暗点
  • 顶帽:图像减去开结果,得到暗图
  • 底帽:图像减去闭结果,得到亮图
  • 形态学梯度:膨胀减去腐蚀,得到边缘