使用Opencv对图片处理的各种原理-从图片的储存形式到各种处理过程(必看)(下)
简介
对于主攻计算机视觉的我们来说,对图片处理几乎时时刻刻都在进行。但在复现了几个网络后,我开始对整个网络过程中,图片到底是怎么变换的产生好奇。因此,在实验室中借阅了本相关的书籍(《Opencv算法精解-基于Python与C++》),通过一段时间的学习,整理。总算大致了解了图片在计算机上的各种转换过程。尤其在学习完之后,原来如此之情油然而生。因此,在这里,希望研究本方向的其他同学(特指入门者,资深学者请忽略)能先了解图片的原理之后,再开始入门深度学习。为方便大家,我在此做了一些总结,可以省去大部分时间,以及有些书籍中的opencv版本过低,某些算法已经改变。希望本篇博客能给大家带来帮助,也欢迎大家指出问题。
目录
- Opencv简介
- 图像数值化
- 几何变化
- 对比度增强
- 图像平滑
- 阈值分割
- 形态学处理
对比度增强
简介
前面我们已经知道了,图像就是由无数个灰度值组成的,那么图像上是否清晰,其实就转变成了灰度值之间的据对峙大小的程度,相差越大,则图像越清晰。
接下来看个基本例子:
灰度直方图
横坐标为256个灰度值,纵坐标为该数值下的灰度值个数,接下来让我们做一下基本变化
变换原理
图像就是矩阵,这样的话,我们直接通过矩阵的运算改变其灰度值。
前面的变换,其实都是基于坐标,而不改变灰度值,而这里的变化,则是改变的灰度值,并没有改变坐标,也就是进行初等变换,乘除加减等
基本变换
-
线性变换:设置一个线性函数,从而改变灰度值
正规化:通过将 输入图像的灰度值最大距离 与 输出图像的最大距离 的比值作为系数(k),当前的灰度值与最小灰度值的差作为变量(x),再将输出图像的最小灰度值作为变化范围(b) ,通过图像本身决定系数,而不再是人为设置
正规化函数:normalize(),里面可选择img的范数,从而改变系数的不同。(1-范数(绝对值的和),2-范数(平方和的开方)等) -
非线性变换:
伽马变换:将灰度值归一化(除以255),之后进行幂运算。指数小于1时:增加对比度(暗区域感兴趣),指数大于1时,降低对比度(亮区间感兴趣)。
均衡化:计算直方图后,对直方图累加求和得到累加直方图,根据累加直方图找到关系。
限制对比度的自适应直方图均衡化:通过划分为不同区域块,然后分别均衡化,如果有噪声超过限制值,则裁剪,并且将多处的部分分配给其他块。
现在我们已经知道了变换的原理,但我们改变的都是整体,所以需要我们找到一个阈值,从而增加对比度,所以最主要的问题是如何找到阈值。简单来说,就是不同的灰度值,对应不同的变换,首先想到的就是函数
最简单的:
Img=img*2
为什么×2之后,会出现某些灰度值出现0?其实回想原理,图像的储存使uint8,也就是说,超过256后,会通过取模而得到小于255的值。如:244*2=488,(按规定,不能超过255)则488%255=233,但是我们改变类型的话,则不会出现这种情况,如:float
改变类型之后的灰度值
仔细看横坐标的变换,不再是原来的255,这就说明此时的图像类型已经改变,不再是uint8,此时已经变成float类型,也就是前面说过的32bit等,此时的色阶更细致
分段变换
设置一个阈值,从而进行不同的操作
正规化
其他例子就不一一展示了,可以去自己尝试。不过对图像的对比度提升效果显著,不过也可能也会造成一定的噪声,如何去除,会在后面的图像平滑补充。
图像平滑
简介
去除由灰度值随机变化而造成的噪点
二维离散卷积
- Full卷积:无论边界,对每一个值进行卷积,(边界外取0),(处理后,图像变大)
- Vaild卷积:对边界处的值无运算,只运算包含在填充了卷积的值 (处理后,变小)
- Same卷积:通过定义锚点,进行运算 (处理后,保持原大小)
边界补充
常用方式
边界补充常数,通常为0
重复边界的值进行补充
卷绕输入矩阵,矩阵的平铺
镜像处理
函数:
Cv2.copyMakeBorder(img,top,bottom,left,right,borderType,value)
borderType:
BORDER_REPLICATE:边界复制
BORDER_CONSTANT:常数补充
BORDER_REFLECT:反射补充
BORDER_REFLECT_101:边界为中心补充
BORDER_WRAP:平铺补充
卷积的过程
Convoluted2d(img,kernel,mode = ‘full’,boundary=‘fill’,fillvalue=0)
Mode :卷积类型,full,vaild,same
Boundary :边界补充方式
卷积前
卷积后
可分离卷积
通过分离卷积,将其变成分别为垂直,水平方向的卷积,从而进行运算
图像平滑,除噪
- 高斯平滑:通过高斯卷积算子进行运算。Cv2.getGaussianKernel(ksize,sigma,ktype)
- 均值平滑:构造全为1的卷积,之后除以元素总个数
- 快速均值平滑:通过该点领域的和除以该点领域的面积。面积可由图像的积分计算(左上角的所有和)
- 中值平滑:对领域的值进行排序,取中间值。medianBlur(img,ksize)
阈值分割
简介
所谓的二值化,灰度值只有0,1
方法概述
- 全局阈值分割:设置阈值,全局划分。Cv2.threshold(img,thresh,maxval,type)
- 局部阈值分割:对应每一个坐标的值阈值不同
阈值选取
- 直方图技术:通过查找波谷,确定阈值
Otsu阈值 - 自适应阈值:利用平滑结果的矩阵作为阈值:cv2.adaptiveThreshold(img,255,adaptiveMethod(平滑类型),thresholdType,blockSize,c)
注:因为为二值图,因此可以做逻辑运算。
Otsu
自适应阈值
逻辑“非”
形态学处理
简介
- 腐蚀:卷积内取最小值
- 膨胀:卷积内取最大值
- 开:先腐蚀再膨胀,去除亮点
- 闭:先膨胀再腐蚀,去除暗点
- 顶帽:图像减去开结果,得到暗图
- 底帽:图像减去闭结果,得到亮图
- 形态学梯度:膨胀减去腐蚀,得到边缘
下一篇: tomcat的部署方式和请求处理过程