对于主攻计算机视觉的我们来说,对图片处理几乎时时刻刻都在进行。但在复现了几个网络后,我开始对整个网络过程中,图片到底是怎么变换的产生好奇。因此,在实验室中借阅了本相关的书籍(《Opencv算法精解-基于Python与C++》),通过一段时间的学习,整理。总算大致了解了图片在计算机上的各种转换过程。尤其在学习完之后,原来如此之情油然而生。因此,在这里,希望研究本方向的其他同学(特指入门者,资深学者请忽略)能先了解图片的原理之后,再开始入门深度学习。为方便大家,我在此做了一些总结,可以省去大部分时间,以及有些书籍中的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%5=233,但是我们改变类型的话,则不会出现这种情况,如:float
改变类型之后的灰度值 仔细看横坐标的变换,不再是原来的255,这就说明此时的图像类型已经改变,不再是uint8,此时已经变成float类型,也就是前面说过的32bit等,此时的色阶更细致
分段变换 设置一个阈值,从而进行不同的操作
正规化 其他例子就不一一展示了,可以去自己尝试。不过对图像的对比度提升效果显著,不过也可能也会造成一定的噪声,如何去除,会在后面的图像平滑补充。
去除由灰度值随机变化而造成的噪点
常用方式 边界补充常数,通常为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 :边界补充方式
卷积前 卷积后
可分离卷积 通过分离卷积,将其变成分别为垂直,水平方向的卷积,从而进行运算
所谓的二值化,灰度值只有0,1
注:因为为二值图,因此可以做逻辑运算。