卷积运算需要用到:卷积矩阵、图像矩阵。
卷积矩阵是一个二维数组。构成卷积矩阵的主要元素有:奇数行、奇数列、锚点(感兴趣元
素),卷积矩阵又被称为卷积核。
例如,若一个卷积矩阵为:
k e r n e l = ∣ − 1 − 1 − 1 − 1 9 − 1 − 1 − 1 − 1 ∣ kernel = \left |\begin{array}{cccc} -1 &-1 & -1 \\ -1 &9 & -1 \\ -1 & -1& -1 \\ \end{array}\right| kernel=∣∣∣∣∣∣−1−1−1−19−1−1−1−1∣∣∣∣∣∣
该矩阵中,感兴趣的像素权重为 9,其周围的元素权重为 -1。对于被计算的像素点而言,该点的新像
素值为用当前的像素值乘以 9,然后减去该像素周围的各像素值(之所以是减去,是因为
其余八个像素点的权重为 -1)。
假设有一个 3×3 大小的图像,其像素值为:
k e r n e l = ∣ A 1 A 2 A 3 B 1 B 2 B 3 C 1 C 2 C 3 ∣ kernel = \left |\begin{array}{cccc} A_{1} &A_{2}&A_{3} \\ B_{1} &B_{2}&B_{3} \\ C_{1} &C_{2}&C_{3} \\ \end{array}\right| kernel=∣∣∣∣∣∣A1B1C1A2B2C2A3B3C3∣∣∣∣∣∣
则以B2像素为例,其像素值计算公式为:
像 素 值 = ( − 1 ) ∑ i = 1 3 A i + ( − 1 ) ∑ i = 1 3 C i + ( − B 1 ) + ( − B 3 ) + + ( 9 B 2 ) 像素值 =(-1)\sum\limits_{i=1}^{3}A_{i} + (-1)\sum\limits_{i=1}^{3}C_{i} + (-B_{1})+(-B_{3})++(9B_{2}) 像素值=(−1)i=1∑3Ai+(−1)i=1∑3Ci+(−B1)+(−B3)++(9B2)
卷积矩阵的各个元素之和如果为 1,则图像的亮度不会改变。如果矩阵各个元素相加之和为
0,则会将边缘转换成白色,非边缘转换成黑色。
这个函数的组成元素有:
对于 OpenCV 而言,一个对图像进行操作的函数一般都会有一个输入数组(InputArray)和
一个输出数组(OutputArray),这两个参数分别用来输入要处理的图像和输出处理后的图像。
第三个参数(Ksize)的作用为设置卷积核的大小,可以是(3,3)或(5,5)等。边缘检测与模糊化
函数的参数很多,但总会有 ksize 参数(奇数),其表示滤波核的宽和高。对于 medianBlur()
函数,它的 Ksize 设在 3 以下相当于关闭效果,Ksize 值越高,代价越大。
第四个参数为锚点坐标,默认输入为(-1,-1),即为锚点处在卷积核的中心,如果不想改变这
个锚点的位置,可以跳过对这个参数的输入。
最后一个参数为边界类型,这个参数同样有一个默认值,BORDER_DEFAULT 的作用为,将
输出图像的边缘地区用原图像的边缘像素来填充。(输出的图像一般会比输入的原图像要大,
这样做是为了使程序能够有效处理原图像的边界)
在 python 中,dst 一般作为接收函数返回值的变量,而不直接写入到函数中。
在最简单的调用中,只需要输入两个值:
dst = cv2.blur(img,(5,5))
为缓解识别边缘时的噪声影响,通常在使用边缘检测滤波之前,要对图像进行模糊化处
理,cv2.medianBlur()函数对处数字化视频噪声非常有效,特别是除去彩色图像的噪声。
该函数的组成成员有:
Ksize 为卷积核的大小。
卷积核大小越大,滤波的效果就越明显。
result = cv2.medianBlur(img, 5)
该函数的成员有:
成员 int d:
这个 d 表示以当前像素点为中心点的直径。如果该值为非正数,则会自动从参数 sigmaSpace
中计算得到。如果滤波空间较大,则运算速度会较慢,一般推荐 d=5。对于较大噪声的滤波,
可以选择 d=9。
成员 sigmaColor:
这个值决定了周围有哪些点能参与滤波计算,与当前像素点像素值的差值小于这个 sigma 值
的像素将参与滤波运算。当取 255 时,当前像素点周围的所有点都将参与运算。
必要的参数:
dst = cv2.bilateralFilter(img, d=9, sigmaColor = 255, sigmaSpace = 0)
该函数的成员有:
成员 int ddepth:
该变量表示输出图像的深度,如果该值为-1,则深度和原图像相同。
成员 bool normalize:
该变量为归一化处理变量,默认值为 true,当该值为 true 时,方框滤波就是均值滤波。
(如果想使用该成员的默认值,在输入参数时无需输入该成员/或输入 normalize = true)
必要参数:
dst = cv2.boxFilter(img, -1, (5,5))
运行结果:
输入:
dst = cv2.boxFilter(img, -1, (5,5), normalize = False)
该函数的成员有:
成员 sigmaX:
表示核在 X 轴上的标准偏差。
成员 sigmaY:
表示核在 Y 轴上的标准偏差。当该值为 0 时,表示与 sigmaX 取同样的值。
必要成员:
dst = cv2.GaussianBlur(img, (11,11), 0)
OK今天的砖先搬到这。