文章目录
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算子是水平差分+垂直平滑的结果,下面这个是水平平滑+垂直差分的结果。
【优点】计算简单,速度快
【缺点】计算方向单一,只有水平和垂直方向,难以应对复杂纹理;根据差分结果直接用单一阈值进行判断是否边缘像素,对有的噪声情况无法进行很好的处理
-
canny
虽然比较古老,但却是传统图像处理中,边缘检测的首选,性能