可以免费注册的网站,一个设计网站多少钱,自己做视频类网站用哪个cms,做网页向网站提交数据目录
一、环境
二、图像卷积
三、代码演示
3.1、锐化
3.2、sobel边缘#xff0c;x方向
3.3、sobel边缘#xff0c;y方向
3.4、高斯模糊
3.5、完整代码 一、环境
本文使用环境为#xff1a;
Windows10Python 3.9.17opencv-python 4.8.0.74
二、图像卷积
在OpenCV…目录
一、环境
二、图像卷积
三、代码演示
3.1、锐化
3.2、sobel边缘x方向
3.3、sobel边缘y方向
3.4、高斯模糊
3.5、完整代码 一、环境
本文使用环境为
Windows10Python 3.9.17opencv-python 4.8.0.74
二、图像卷积
在OpenCV中filter2D函数是用于在图像空间域进行卷积操作的函数。然而你也可以通过fft2和ifft2函数在频率域进行滤波。下面我将对这两种方法进行简单的比较。
空间域卷积
空间域卷积是一种直接在图像上应用滤波器的方法。filter2D函数会接受一个输入图像和一个滤波器然后在输入图像上应用滤波器。滤波器是一个二维数组通常是一个核对图像进行卷积。例如你可以使用一个边缘检测滤波器来检测图像中的边缘。
优点
直观空间域卷积直观易懂易于实现和理解。计算效率高由于滤波器直接应用于图像像素因此这种方法的计算效率相对较高。
缺点
边缘效应空间域卷积可能会在图像边缘产生不期望的效应例如边缘像素的变形。无法处理大滤波器由于卷积核需要覆盖整个图像因此对于大的滤波器空间域卷积可能会变得非常慢。
频域滤波
频域滤波是在频率域上应用滤波器的方法。首先使用fft2函数将输入图像转换到频率域然后应用滤波器最后使用ifft2将结果转换回空间域。在频率域上滤波器可以是一个一维数组大大降低了处理时间和内存需求。
优点
处理大滤波器由于在频率域上进行滤波所以可以处理任意大小的滤波器而不会增加卷积核的大小。边缘效应减少由于在频率域上进行操作所以可以减少在空间域卷积中出现的边缘效应。
缺点
计算复杂度增加频域滤波需要额外的步骤来转换图像到频率域和回空间域这会增加计算的复杂度。对噪声敏感频率域滤波可能会放大图像中的噪声特别是在高频部分。需要更多的内存频域滤波需要额外的内存来存储频率域的图像和滤波器。
总的来说空间域卷积和频域滤波各有其优点和缺点。选择哪种方法取决于你的具体需求和问题。例如如果你需要处理非常大的滤波器或者需要减少边缘效应那么频域滤波可能是一个更好的选择。如果你需要快速简单的方法或者处理小滤波器那么空间域卷积可能更适合你。
三、代码演示
卷积在图像中原理很简单如下图图像I1被卷积核K提取特征最终得到I2但是要注意I1维度是5x5的计算的时候需要将其四周边界进行拓展padding形成7X7的矩阵拓展区域填充0然后卷积最后才能得到5X5的I2。 3.1、锐化 # 卷积核锐化kernel_shape np.array([[0, -1, 0],[-1, 5, -1],[0, -1, 0]], np.float32) # kernel should be floating point type
下面左边是原图右边是效果图效果图明显比原图更加清晰。 3.2、sobel边缘x方向
# 卷积核sobel边缘X方向kernel_sebelx np.array([[-1, 0, 1],[-2, 0, 2],[-1, 0, 1]], np.float32) 3.3、sobel边缘y方向
# 卷积核sobel边缘y方向kernel_sebely np.array([[1, 2, 1],[0, 0, 0],[-1, -2, -1]], np.float32) 3.4、高斯模糊
# 卷积核高斯模糊元素和为1kernel_gaussian np.array([[0.1, 0.1, 0.1],[0.1, 0.2, 0.1],[0.1, 0.1, 0.1]], np.float32) 3.5、完整代码
from __future__ import print_function
import sys
import time
import numpy as np
import cv2 as cvdef 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) # 卷积核高斯模糊元素和为1kernel_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 0if __name__ __main__:main(sys.argv[1:])