目录
一、环境
二、图像卷积
三、代码演示
3.1、锐化
3.2、sobel边缘,x方向
3.3、sobel边缘,y方向
3.4、高斯模糊
3.5、完整代码
本文使用环境为:
在OpenCV中,filter2D
函数是用于在图像空间域进行卷积操作的函数。然而,你也可以通过fft2
和ifft2
函数在频率域进行滤波。下面我将对这两种方法进行简单的比较。
空间域卷积:
空间域卷积是一种直接在图像上应用滤波器的方法。filter2D
函数会接受一个输入图像和一个滤波器,然后在输入图像上应用滤波器。滤波器是一个二维数组,通常是一个核对图像进行卷积。例如,你可以使用一个边缘检测滤波器来检测图像中的边缘。
优点:
缺点:
频域滤波:
频域滤波是在频率域上应用滤波器的方法。首先,使用fft2
函数将输入图像转换到频率域,然后应用滤波器,最后使用ifft2
将结果转换回空间域。在频率域上,滤波器可以是一个一维数组,大大降低了处理时间和内存需求。
优点:
缺点:
总的来说,空间域卷积和频域滤波各有其优点和缺点。选择哪种方法取决于你的具体需求和问题。例如,如果你需要处理非常大的滤波器或者需要减少边缘效应,那么频域滤波可能是一个更好的选择。如果你需要快速简单的方法或者处理小滤波器,那么空间域卷积可能更适合你。
卷积在图像中原理很简单,如下图,图像I1被卷积核K提取特征,最终得到I2,但是要注意,I1维度是5x5的,计算的时候,需要将其四周边界进行拓展(padding),形成7X7的矩阵(拓展区域填充0),然后卷积,最后才能得到5X5的I2。
# 卷积核:锐化
kernel_shape = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]], np.float32) # kernel should be floating point type
下面左边是原图,右边是效果图,效果图明显比原图更加清晰。
# 卷积核:sobel边缘,X方向
kernel_sebelx = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]], np.float32)
# 卷积核:sobel边缘,y方向
kernel_sebely = np.array([[1, 2, 1],
[0, 0, 0],
[-1, -2, -1]], np.float32)
# 卷积核:高斯模糊,元素和为1
kernel_gaussian = np.array([[0.1, 0.1, 0.1],
[0.1, 0.2, 0.1],
[0.1, 0.1, 0.1]], np.float32)
from __future__ import print_function
import sys
import time
import numpy as np
import cv2 as cv
def main(argv):
src = cv.imread('7.jpg', 1)
cv.namedWindow("Input", cv.WINDOW_AUTOSIZE)
cv.namedWindow("Output", cv.WINDOW_AUTOSIZE)
cv.imshow("Input", src)
# 卷积核:锐化
kernel_shape = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]], np.float32) # kernel should be floating point type
# 卷积核:sobel边缘,X方向
kernel_sebelx = np.array([[-1, 0, 1],
[-2, 0, 2],
[-1, 0, 1]], np.float32)
# 卷积核:sobel边缘,y方向
kernel_sebely = np.array([[1, 2, 1],
[0, 0, 0],
[-1, -2, -1]], np.float32)
# 卷积核:高斯模糊,元素和为1
kernel_gaussian = np.array([[0.1, 0.1, 0.1],
[0.1, 0.2, 0.1],
[0.1, 0.1, 0.1]], np.float32)
#dst1 = cv.filter2D(src, -1, kernel_shape)
#dst1 = cv.filter2D(src, -1, kernel_sebelx)
#dst1 = cv.filter2D(src, -1, kernel_sebely)
dst1 = cv.filter2D(src, -1, kernel_gaussian)
cv.imshow("Output", dst1)
cv.waitKey(0)
cv.destroyAllWindows()
return 0
if __name__ == "__main__":
main(sys.argv[1:])