网站建设费用的会计分录,今科网站建设,做网站用的字体,群晖wordpress 外网图像卷积操作#xff08;convolution#xff09;#xff0c;或称为核操作#xff08;kernel#xff09;#xff0c;是进行图像处理的一种常用手段#xff0c;
图像卷积操作的目的是利用像素点和其邻域像素之前的空间关系#xff0c;通过加权求和的操作#xff0c;实现…图像卷积操作convolution或称为核操作kernel是进行图像处理的一种常用手段
图像卷积操作的目的是利用像素点和其邻域像素之前的空间关系通过加权求和的操作实现模糊blurring锐化sharpening边缘检测edge detection等功能。
期末考试结束又开始学习opencv啦 1、什么是图片卷积
图像卷积 就是 卷积核在图像上按行滑动遍历像素时不断地相乘求和的过程 2D卷积需要4个嵌套循环4-double loop所以它并不快除非我们使用很小的卷积核。这里一般使用3x3或者5x5。而且对于滤波器也有一定的规则要求
1滤波器的大小应该是奇数例如3x35x5或者7x7。原因后面会提到
2滤波器矩阵所有的元素之和应该要等于1这是为了保证滤波前后图像的亮度保持不变。当然了这不是硬性要求了。
3如果滤波器矩阵所有元素之和大于1那么滤波后的图像就会比原图像更亮反之如果小于1那么得到的图像就会变暗。如果和为0图像不会变黑但也会非常暗。
4对于滤波后的结构可能会出现负数或者大于255的数值。对这种情况我们将他们直接截断到0和255之间即可。对于负数也可以取绝对值。
步长
步长就是卷积核在图像上移动的步幅充分扫描图片步长一般为1
下例步长为2不太常见 padding
上面的例子中发现卷积操作后图片的长宽会变小如果要保持图片大小不变我们需要在图片的周围填充0padding指的是填充0的圈数 可以通过公式计算出需要填充的0的圈数 右下角的公式是PF-1/2
自动认为步长为0哈
卷积核的大小 滤波器的大小应该是奇数。
这样它才有一个中心例如3x35x5或者7x7。有中心了也有了半径的称呼例如5x5大小的核的半径就是2。根据上面的padding公式如果保持图片大小不变采用偶数卷积核的话比如4*4将会出现填充1.5圈0的情况有中心指出滤波器的位置即opencv卷积中的锚点
卷积案例
函数
filter2D(src, ddepth, kernel[, dst[,anchor[,delta[,borderType]]]]) ddepth是卷积之后的位深即卷积之后图片的位深即卷积之后图片的数据类型一般设为-1表示和原图类型一致 kernel是卷积核大小用元组或者ndarray表示要求数据类型必须是float型anchor锚点即卷积核的中心点是可选参数默认值是-1-1delta 可选参数表示卷积之后额外加一个值相当于线性方程中的偏差默认是0borderType边界类型一般不设 模糊 实例
import cv2
import numpy as np
img cv2.imread(F:\est01\e3.jpg)
kernel np.ones((5, 5), np.float32)/25
# 卷积操作
dst cv2.filter2D(img, -1, kernel)
cv2.imshow(img, np.hstack((img, dst)))
cv2.waitKey(0)
cv2.destroyAllWindows()
其他函数说明
1、np.ones()函数
返回给定形状和数据类型的新数组其中元素的值设置为1。此函数与numpy zeros()函数非常相似。
np.ones(shape, dtypeNone, orderC) shape一个整数类型或者一个整数元组用于定义数组的大小。如果仅指定一个整数类型变量则返回一维数组。如果指定的是整数元组则返回给定形状的数组。dtype可选参数默认值为float。用于指定数组的数据类型。order指定内存重以行优先(‘C’)还是列优先(‘F’)顺序存储多维数组。 2、拼接数组
np.vstack():在竖直方向上堆叠
np.hstack():在水平方向上平铺 就是相当于两张图片组合到一块 结果
np.ones((5, 5), np.float32)/25
结合上面的原理/25相当于取平均值所以就是模糊的效果了