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

    科技2022-07-17  134

    简介

    对于主攻计算机视觉的我们来说,对图片处理几乎时时刻刻都在进行。但在复现了几个网络后,我开始对整个网络过程中,图片到底是怎么变换的产生好奇。因此,在实验室中借阅了本相关的书籍(《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%5=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

    自适应阈值

    逻辑“非”

    形态学处理

    简介

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