1.1 卷积定义
在图像处理中,卷积操作指的是使用一个卷积核对图像中的每个像素进行一系列操作。
卷积核(算子)是用来做图像处理时的矩阵,图像处理时也称为掩膜,是与原图像做运算的参数。卷积核通常是一个四方形的网格结构(例如3*3的矩阵或像素区域),该区域上每个方格都有一个权重值。
使用卷积进行计算时,需要将卷积核的中心放置在要计算的像素上,一次计算核中每个元素和其覆盖的图像像素值的乘积并求和,得到的结构就是该位置的新像素值。
1.2 卷积矩阵及其运算过程
矩阵的卷积运算主要用在图像处理中,假设输入信号为x[m,n],**响应为h[m,n],则其卷积定义为:
X
不过在图像处理中这里的**响应(也称为核)h[m,n]通常是一个3乘3矩阵,其下标如下图所示
其余下标的值取0,注意到原点(0,0)是是矩阵的中心。
在图像处理中,输入信号x[m,n]的非零值通常是横坐标从0到M-1,纵坐标从0到N-1,这里M和N分别是图像宽和高的值,其余的值设置为0。
根据定义可以直接计算矩阵的卷积。假设我们有一个3x3的核和一个3x3的输入:
核 输入 输出
具体的计算过程如下(首先,将核旋转180度):
1.3 卷积应用在图像处理
1.3.1 保持原图
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image\\lenaNoise.png',cv2.IMREAD_UNCHANGED)
kernel1 = np.array([[0,0,0],
[0,1,0],
[0,0,0]])
res = cv2.filter2D(img,-1,kernel=kernel4)
cv2.imshow('img',img)
cv2.imshow('res',res)
cv2.waitKey()
cv2.destroyAllWindows()
1.3.2 均值模糊
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image\\lenaNoise.png',cv2.IMREAD_UNCHANGED)
kernel2 = np.array([[1/9,1/9,1/9],
[1/9,1/9,1/9],
[1/9,1/9,1/9]])
res = cv2.filter2D(img,-1,kernel=kernel2)
cv2.imshow('img',img)
cv2.imshow('res',res)
cv2.waitKey()
cv2.destroyAllWindows()
1.3.3 图像锐化
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image\\lenaNoise.png',cv2.IMREAD_UNCHANGED)
kernel3 = np.array([[-1,-1,-1],
[-1,9,-1],
[-1,-1,-1]])
res = cv2.filter2D(img,-1,kernel=kernel2)
cv2.imshow('img',img)
cv2.imshow('res',res)
cv2.waitKey()
cv2.destroyAllWindows()
1.3.4 边缘检测
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image\\lenaNoise.png',cv2.IMREAD_UNCHANGED)
kernel4 = np.array([[-1,-1,-1],
[-1,8,-1],
[-1,-1,-1]])
res = cv2.filter2D(img,-1,kernel=kernel4)
cv2.imshow('img',img)
cv2.imshow('res',res)
cv2.waitKey()
cv2.destroyAllWindows()