本地主机 搭建网站,上海市建设工程信息报送网站,中国建设银行公积金网缴网站,遵义房产信息网一副图像通过滤波器得到另一张图像#xff0c;其中滤波器又称为卷积核#xff0c;滤波的过程称之为卷积。 这就是一个卷积的过程#xff0c;通过一个卷积核得到另一张图片#xff0c;明显发现新的到的图片边缘部分更加清晰了#xff08;锐化#xff09;。 上图就是一个卷…一副图像通过滤波器得到另一张图像其中滤波器又称为卷积核滤波的过程称之为卷积。 这就是一个卷积的过程通过一个卷积核得到另一张图片明显发现新的到的图片边缘部分更加清晰了锐化。 上图就是一个卷积的过程下面的是原始图像上面的是卷积核。卷积核以一定步长对于原始图像进行卷积处理得到新的图像。
卷积核的大小上图中的卷积核是5x5大小的卷积核。
锚点就是卷积核最中心的位置
边界扩充进行卷积后的图像一般比原始图像要小一点为了和原始图像大小相同就需要进行边界扩充。
步长就是卷积核对原始图像进行扫描时每一次移动几个像素。
卷积核的大小
1卷积核一般为奇数如3x35x57x7
一方面是为了增加padding的原因就是进行扩充操作。
另一方面是保证锚点在中间大家可以自己画一下3x3和4x4的矩阵进行思考有什么区别防止位置发生偏移。
2卷积核大小的影响卷积核越大看到的信息感受野就越多提取的特征就越好同时计算量就越大。目前很多深度学习领域中使用两个或多个小的卷积核代替大的卷积核
3边界扩充当卷积核大于1且不进行边界扩充时输出的尺寸一定会变小所以需要进行边界扩充维持原来的大小。 上图中下面的是原图上面的是进行卷积后的图片卷积核大小就是如图中的3x3虚线部分就是进行边界扩充后的所以很直观感受到在进行边界扩充后才会变成原始的图像大小。 利用上述公式就可以得出不同的参数了这对我们使用多大的卷积核希望得到多大尺寸的图片都很有帮助。
4步长大小 上图中的步长就是2。 低通滤波与高通滤波
低通滤波与高通滤波相关知识
低通滤波就是低于某个阈值是可以通过的
高通滤波就是高于某个阈值是可以通过的
低通滤波可以去除噪音或平滑图像美颜中磨皮去痘
高通滤波可以帮助插值图像的边缘抠图时需要边缘
图像卷积
filter2DsrcddepthkernelanchordeltaborderType
src操作的原始图像
ddepth位深通常设置为-1
kernel卷积核 重要
anchor锚点核的中心点默认为-1根据核直接去得到锚点
delta原始图进行卷积后得到的图加上delta默认为0
borderType边界类型加黑边等等 一般取默认值 如图卷积核是上图就意味着在原图中选5x5的像素每个值都乘1进行相加得到的结果乘1/25就取得平均值更加平滑。
图像卷积实战代码
import cv2
import numpy as npimg cv2.imread(../MM/preview.jpg)# 自己设计的kernel的方法
kernel np.ones((5, 5), np.float32) / 25
dst cv2.filter2D(img, -1, kernel)cv2.imshow(dst, dst)
cv2.imshow(img, img)cv2.waitKey(0)左边是原图右边是处理后的图片。
看代码我们设置的是5x5的全为1的矩阵最后除25.得到结果更加平滑但是清晰度明显下降了。因此我们自己创的kernel往往不太合适需要一些现存的效果较好的滤波器 方盒滤波和均值滤波
方盒滤波boxFilter(src,ddepth,ksize,anchor,normalize,borderType)
均值滤波blur(src,ksize,anchor,borderType)
src:处理的图像
ddepth位深通常设置为-1
ksizekernel size 卷积核大小
anchor锚点核的中心点默认为-1根据核直接去得到锚点
normalize当normalize为True时a1/(W*H) 此时会退化成均值滤波 当normalize为False时,a1 下图就是方盒滤波的卷积核 borderType边界类型加黑边等等 一般取默认值 。
方盒滤波和均值滤波实战代码
均值滤波
# 均值滤波
dst cv2.blur(img, (5, 5)) # 这个是均值滤波 用blur 其结果和自己设计kernel的结果相同
结果和我们在第二部分自己设置kernel的结果相同因为此时矩阵进行相乘后也是除25。
方盒滤波
# 这种是方盒滤波其初始中normalize为true变成均值滤波如果想变成方盒滤波需要把normalize设置false
dst cv2.boxFilter(img, -1, (5, 5), False)
dst1 cv2.boxFilter(img, -1, (5, 5), True) 左边的是通过方盒滤波得到的结果右边是均值滤波得到的结果。 高斯滤波
高斯滤波相关知识 上图就是高斯滤波发现一条曲线越靠近中间值越大权重越大 左边这张图代表的是矩阵中每个位置的大小最中心的大小不一定是最大的虽然第一张图25相较于周围较大 但是最中心点的权重一定是最大的并且越靠近中心权重越大如第二张图每一个数值乘一个权重的数值
高斯滤波APIGaussianBlurimgkernelsigmaXsigmaY……
img需要对哪个图像进行处理
kernel卷积核大小 kernelsize
sigmaXsigmaY到中心点的延展宽度 可以看出不同的sigma值的结果如果没有sigma时就看kernelsize如下图。 高斯滤波实战代码
# 高斯滤波解决高斯滤波,测量值会在均值附近产生大量的值,而离均值较远的值则会较少出现。)
# 设计中的锚点附近的权值较大
dst cv2.GaussianBlur(img1, (5, 5), sigmaX1) 左边是原图发现每个环里面有很多的噪声点经过高斯滤波后发现很多的噪声点都被去掉了但是边缘部分也被处理掉了。大家也可以自己去尝试改变sigma的值看看会出现什么样的结果
高斯滤波主要就是解决高斯噪点。 中值滤波
中值滤波相关知识
假如现在有一个数组[1556789],中值滤波就是取其中的中间值作为卷积后的结果值。
所以当使用卷积核去卷积时每一次都会对卷积后的结果进行排序最后选择中间值。
中值滤波主要针对胡椒噪声整张图像都有噪声有很好的效果。
中值滤波APImedianBlurimgksize
img就是对哪张图片进行操作
ksizekernelsize 卷积核的大小
中值滤波实战代码
# 中值滤波解决胡椒噪音)
dst cv2.medianBlur(img2, 7) 左边是具有胡椒噪声的原图右边是处理后的图片。 但是边缘也是被弱化了。 双边滤波
双边滤波相关知识
可以保留边缘同时对边缘内的区域进行平滑处理。大家思考当时我们使用高斯滤波去除区域内的高斯噪声但是边缘被弱化了。那是否我们可以使用双边滤波解决边缘弱化的问题
双边滤波应用于美颜。 对于输入图像来看边沿就是色差特别大的区域双边滤波并没有对其进行处理而是将边沿两边进行平滑处理。
双边滤波APIbilateralFilterimgdsigmaColorsigmaSpace……
img就是对哪张图片进行操作
d直径可以认为就是核的大小
sigmaColor对边沿的控制在一定范围就不处理边沿
sigmaSpace对边沿两边的控制在一定范围内进行平滑处理
双边滤波实战代码
# 双边滤波(可以保留边缘同时对边缘内的区域进行平滑处理主要作用是进行美颜
dst cv2.bilateralFilter(rita, 7, 20, 50)
# dst1cv2.bilateralFilter(rita,20,20,50) #相比d7d10磨皮效果更好 左边是原图右边是进行双边滤波处理后的图片。大家也可以尝试去修改d等参数获得一个更好的美颜效果。 —————————————以下都是高通滤波—————————————————————— 高通滤波
检测边缘
常见的高通滤波
Sobel索贝尔首先使用了高斯滤波去噪后又一阶导得到边沿
Scharr沙尔当Sober的卷积核大小设置为-1就变成了Scharr
Sobel索贝尔和Scharr沙尔都只能对一个方向进行处理所以得到结果后需要把xy得到的结果加到一起
Laplacian拉普拉斯可以直接求出xy方向的边缘。对于噪音比较敏感因为内部没有降噪的处理。
大家可能这样看xy方向的边缘不太理解等后面实战会有所展示。 Sobel算子
Sobel算子相关知识点
先向x方向上求导然后在y方向求导。最终结果相加。
Sobel算子APISobelsrcddepthdxdyksize3scale1delta0borderTypeBORDER_DEFAULT
src对哪张图进行操作
ddepth输出图像的位深
dx1 就检测出y边缘 dy1就检测出x边缘
ksizekernelsize 卷积核大小 。卷积核大小设置为-1就变成了Scharr
scale用于缩放
delta对结果进行加delta
borderType边缘类型
Sobel实战代码
import cv2
import numpy as npimg cv2.imread(../MM/chess.png)# 索贝尔算子
# y方向的边缘
y cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize5) # 3x3的卷积核就变成了scharr# x方向的边缘
x cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize5) # 默认ksize为3dst x y # python自身带的
dst1 cv2.add(x, y)cv2.imshow(img, img)
cv2.imshow(y, y)
cv2.imshow(x, x)
cv2.imshow(dst, dst)cv2.waitKey(0)第一张图是原图第二张代码中使dy1得到x方向上的边沿。第三张代码中使dx1得到y方向上的边沿。最后代码中的dst和dst1得到的效果都是一样的将xy方向上的边沿加在一起。
Sobel不可以将dxdy都设置成1。大家可以自己设置一些看看会出现什么样的结果。 Scharr算子
Scharr算子相关知识点
与Sobel类似但是使用的kernel值不同。Scharr只支持3x3的卷积核。
Scharr只能求x方向或y方向的边缘。
Scharr的API :Scharrsrcddepthdxdyscale1delta0borderTypeBORDER_DEFAULT
src对哪张图进行操作
ddepth输出图像的位深
dx1 就检测出y边缘 dy1就检测出x边缘
scale用于缩放
delta对结果进行加delta
borderType边缘类型
Scharr算子实战代码 得到的图像和Sobel的图像相同。 但是Scharr还识别出来一些细小的点。Soble用的较多 拉普拉斯算子
拉普拉斯算子相关知识
可以同时求两个方向的边缘不用和Sobel或Scharr一样单独求xy。
拉普拉斯算子对于噪声比较敏感所以一般需要进行去噪后再使用拉普拉斯。
拉普拉斯APILaplaciansrcddepthksize1scale1borderTypeBORDER_DEFAULT
src对哪张图进行操作
ddepth输出图像的位深
ksizekernelsize卷积核大小
scale用于缩放
borderType边缘类型
拉普拉斯实战代码
ldst cv2.Laplacian(img, cv2.CV_64F, ksize5)左图是原图右图是进过拉普拉斯处理后的图片。由于原图中噪音比较少所以直接使用了拉普拉斯。 边缘检测Canny重要
Canny的相关知识
对于SobelScharr需要分别对xy进行操作拉普拉斯需要进行降噪处理。
而Canny相较于这三种就比较完美效果好并且简单。
canny使用的是5x5的高斯滤波消除噪声比拉普拉斯好计算图像梯度方向04590135比SobleScharr全面取局部最大值阈值计算。 阈值计算原理超过maxval的一定是边缘小于minval的一定不是边缘。再maxval和minval之间的可能是可能不是如果像c点一样于超过maxval确定是边缘的线是连续的那c点就是边缘否则像b一样就不是边缘。
Canny的APICannyimgminvalmaxval……
img对哪张图片进行操作
minvalmaxval要进行手动设置阈值
Canny实战代码
import cv2
import numpy as npimg cv2.imread(../MM/preview.jpg)dst cv2.Canny(img, 180, 200)cv2.imshow(img, img)
cv2.imshow(dst, dst)cv2.waitKey(0)大家可以根据自己的图片改变相关的maxval和minval来体会不同的感觉。