CV00-04-卷积

卷积概念

由于不好进行文字描述(懒),我直接推荐一个博客图像卷积,讲解图像卷积的概念。

图像卷积操作(convolution),或称为核操作(kernel),是进行图像处理的一种常用手段,图像卷积操作的目的是利用像素点和其邻域像素之前的空间关系,通过加权求和的操作,实现模糊(blurring),锐化(sharpening),边缘检测(edge detection)等功能。图像卷积的计算过程就是卷积核按步长对图像局部像素块进行加权求和的过程。卷积核实质上是一个固定大小的权重数组,该数组中的锚点通常位于中心。

通常情况下,选取卷积核大小为1x1,3x3,5x5,7x7等。取奇数大小的目的是为了设置卷积核中心为锚点,方便卷积核和图像的对齐处理。设置卷积核大小对称的目的是为了在空间域中充分利用像素点和其领域像素间的关系。当然这不是必须的,如果需要针对某一轴进行处理,可以设置1x3或3x1大小。
————————————————
版权声明:本文为CSDN博主「编号1993」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u012005313/article/details/84068337

举例

滑动平均

列表[1,4,7,5,8,6],我们对这个列表取滑动平均值,滑动窗口大小为3,权重0.2、0.5、0.3边界值采用固定值0。

那么这个这个操作就是一个卷积操作,卷积核大小是2x1,核是[0.2,0.5,0.3]。

卷积计算过程为[0x0.2+4x0.5+7x0.3,1x0.2+4x0.5+7x0.3,……,5x0.2+8x0.5+6x0.3,8x0.2+6x0.5+0x0.3]。

卷积计算结果为[4.1,4.3,5.8,6.3,6.8,4.6]。

可以看出,滑动平均可以借助临近像素点来修正锚点像素,达到平滑、滤波、去噪声等目的。

一阶导数和二阶导数

相邻2个点之间的差值(除以1相当于没有除)就是一阶导数,也就是f(x+1)-f(x),这也是个2x1的卷积核[-1,1]。

相邻2个一阶导数之间的差值(除以1相当于没有除)就是二阶导数,也就是f'(x)-f'(x-1)=(f(x+1)-f(x))-(f(x)-f(x-1)),也就是f(x+1)+f(x-1)-2f(x),这个是3x1的卷积核[1,-2,1]。

一阶导数对于像素变化比较敏感,可以检测到粗边缘。

二阶导数对于像素变化的趋势比较敏感,可以检测到细边缘。

Gaussian高斯滤波

卷积核服从高斯分布的卷积操作。本例采用7x7大小,X和Y方向sigma都为2的卷积核。

不同的是,第一个直接做二维卷积,第二个先做X方向的,再做一个Y方向的。两个结果是一样的。

"""
Gaussian Kernel
"""

import cv2

IMG = cv2.imread('lena.jpg', 1)
IMG_GAUSS1 = cv2.GaussianBlur(IMG, (7, 7), 2)
KERNEL_1D = cv2.getGaussianKernel(7, 2)
IMG_GAUSS2 = cv2.sepFilter2D(IMG, -1, KERNEL_1D, KERNEL_1D)

cv2.imshow('image', IMG)
cv2.imshow('image_gauss1', IMG_GAUSS1)
cv2.imshow('image_gauss2', IMG_GAUSS2)
KEY = cv2.waitKey()
if KEY == 27:
    cv2.destroyAllWindows()
    pass

 

Median中值滤波

对于图像本身而言,中值滤波会使图像模糊。对于噪声,中值滤波可以降低椒盐噪声(图像上零散几个点的噪声)。本例中,采用的核大小是7,也就是从7x7的像素点选取中值来修正锚点像素。

import cv2

IMG = cv2.imread('lena.jpg', 1)
IMG_MEDIAN = cv2.medianBlur(IMG, 7)

cv2.imshow('image', IMG)
cv2.imshow('image_median', IMG_MEDIAN)
KEY = cv2.waitKey()
if KEY == 27:
    cv2.destroyAllWindows()
    pass

Sobel(一阶导数)

一阶导,按照X和Y方向分别求导。按照X方向一阶导检测到的粗边缘都是沿着Y方向的;按照Y方向一阶导检测到的粗边缘都是沿着X方向的。

import cv2
import numpy as np

IMG = cv2.imread('lena.jpg', 1)
X_KERNEL = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]])
Y_KERNEL = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
IMG_X_SOBEL = cv2.filter2D(IMG, -1, X_KERNEL)
IMG_Y_SOBEL = cv2.filter2D(IMG, -1, Y_KERNEL)

cv2.imshow('image', IMG)
cv2.imshow('image_x_sobel', IMG_X_SOBEL)
cv2.imshow('image_y_sobel', IMG_Y_SOBEL)
KEY = cv2.waitKey()
if KEY == 27:
    cv2.destroyAllWindows()
    pass

Laplacian(二阶导数)

二阶导数检测细边缘。

import cv2
import numpy as np

IMG = cv2.imread('lena.jpg', 1)
KERNEL = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
IMG_LAPLACIAN = cv2.filter2D(IMG, -1, KERNEL)

cv2.imshow('image', IMG)
cv2.imshow('image_laplacisn', IMG_LAPLACIAN)
KEY = cv2.waitKey()
if KEY == 27:
    cv2.destroyAllWindows()
    pass

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苦行僧(csdn)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值