• 003 OpenCV filter2D


    目录

    一、环境

    二、图像卷积

    三、代码演示

    3.1、锐化

    3.2、sobel边缘,x方向

    3.3、sobel边缘,y方向

    3.4、高斯模糊

    3.5、完整代码


    一、环境

    本文使用环境为:

    • Windows10
    • Python 3.9.17
    • opencv-python 4.8.0.74

    二、图像卷积

    在OpenCV中,filter2D函数是用于在图像空间域进行卷积操作的函数。然而,你也可以通过fft2ifft2函数在频率域进行滤波。下面我将对这两种方法进行简单的比较。

    空间域卷积:

    空间域卷积是一种直接在图像上应用滤波器的方法。filter2D函数会接受一个输入图像和一个滤波器,然后在输入图像上应用滤波器。滤波器是一个二维数组,通常是一个核对图像进行卷积。例如,你可以使用一个边缘检测滤波器来检测图像中的边缘。

    优点:

    1. 直观:空间域卷积直观易懂,易于实现和理解。
    2. 计算效率高:由于滤波器直接应用于图像像素,因此这种方法的计算效率相对较高。

    缺点:

    1. 边缘效应:空间域卷积可能会在图像边缘产生不期望的效应,例如边缘像素的变形。
    2. 无法处理大滤波器:由于卷积核需要覆盖整个图像,因此对于大的滤波器,空间域卷积可能会变得非常慢。

    频域滤波:

    频域滤波是在频率域上应用滤波器的方法。首先,使用fft2函数将输入图像转换到频率域,然后应用滤波器,最后使用ifft2将结果转换回空间域。在频率域上,滤波器可以是一个一维数组,大大降低了处理时间和内存需求。

    优点:

    1. 处理大滤波器:由于在频率域上进行滤波,所以可以处理任意大小的滤波器,而不会增加卷积核的大小。
    2. 边缘效应减少:由于在频率域上进行操作,所以可以减少在空间域卷积中出现的边缘效应。

    缺点:

    1. 计算复杂度增加:频域滤波需要额外的步骤来转换图像到频率域和回空间域,这会增加计算的复杂度。
    2. 对噪声敏感:频率域滤波可能会放大图像中的噪声,特别是在高频部分。
    3. 需要更多的内存:频域滤波需要额外的内存来存储频率域的图像和滤波器。

    总的来说,空间域卷积和频域滤波各有其优点和缺点。选择哪种方法取决于你的具体需求和问题。例如,如果你需要处理非常大的滤波器或者需要减少边缘效应,那么频域滤波可能是一个更好的选择。如果你需要快速简单的方法或者处理小滤波器,那么空间域卷积可能更适合你。

    三、代码演示

    卷积在图像中原理很简单,如下图,图像I1被卷积核K提取特征,最终得到I2,但是要注意,I1维度是5x5的,计算的时候,需要将其四周边界进行拓展(padding),形成7X7的矩阵(拓展区域填充0),然后卷积,最后才能得到5X5的I2。

    3.1、锐化

    1. # 卷积核:锐化
    2. kernel_shape = np.array([[0, -1, 0],
    3. [-1, 5, -1],
    4. [0, -1, 0]], np.float32) # kernel should be floating point type

    下面左边是原图,右边是效果图,效果图明显比原图更加清晰。

    3.2、sobel边缘,x方向

    1. # 卷积核:sobel边缘,X方向
    2. kernel_sebelx = np.array([[-1, 0, 1],
    3. [-2, 0, 2],
    4. [-1, 0, 1]], np.float32)

    3.3、sobel边缘,y方向

    1. # 卷积核:sobel边缘,y方向
    2. kernel_sebely = np.array([[1, 2, 1],
    3. [0, 0, 0],
    4. [-1, -2, -1]], np.float32)

    3.4、高斯模糊

    1. # 卷积核:高斯模糊,元素和为1
    2. kernel_gaussian = np.array([[0.1, 0.1, 0.1],
    3. [0.1, 0.2, 0.1],
    4. [0.1, 0.1, 0.1]], np.float32)

    3.5、完整代码

    1. from __future__ import print_function
    2. import sys
    3. import time
    4. import numpy as np
    5. import cv2 as cv
    6. def main(argv):
    7. src = cv.imread('7.jpg', 1)
    8. cv.namedWindow("Input", cv.WINDOW_AUTOSIZE)
    9. cv.namedWindow("Output", cv.WINDOW_AUTOSIZE)
    10. cv.imshow("Input", src)
    11. # 卷积核:锐化
    12. kernel_shape = np.array([[0, -1, 0],
    13. [-1, 5, -1],
    14. [0, -1, 0]], np.float32) # kernel should be floating point type
    15. # 卷积核:sobel边缘,X方向
    16. kernel_sebelx = np.array([[-1, 0, 1],
    17. [-2, 0, 2],
    18. [-1, 0, 1]], np.float32)
    19. # 卷积核:sobel边缘,y方向
    20. kernel_sebely = np.array([[1, 2, 1],
    21. [0, 0, 0],
    22. [-1, -2, -1]], np.float32)
    23. # 卷积核:高斯模糊,元素和为1
    24. kernel_gaussian = np.array([[0.1, 0.1, 0.1],
    25. [0.1, 0.2, 0.1],
    26. [0.1, 0.1, 0.1]], np.float32)
    27. #dst1 = cv.filter2D(src, -1, kernel_shape)
    28. #dst1 = cv.filter2D(src, -1, kernel_sebelx)
    29. #dst1 = cv.filter2D(src, -1, kernel_sebely)
    30. dst1 = cv.filter2D(src, -1, kernel_gaussian)
    31. cv.imshow("Output", dst1)
    32. cv.waitKey(0)
    33. cv.destroyAllWindows()
    34. return 0
    35. if __name__ == "__main__":
    36. main(sys.argv[1:])

  • 相关阅读:
    数云融合丨重构传统商贸数字化解决方案
    计算机毕业设计Java家政服务系统(源码+系统+mysql数据库+lw文档)
    wininet,winhttp,xmlhttprequest,各版本区别 《转》
    Android 从Java线程到Handler机制源码分析
    26-Java访问者模式 ( Visitor Pattern )
    Newsletter 2022-11|HStreamDB 0.11 发布
    HDFS 分布式环境搭建
    物联网中基于WiFi的室内温度检测系统设计
    前端面试话术集锦第 14 篇:高频考点(React常考基础知识点)
    朗道统计物理化学势的引入
  • 原文地址:https://blog.csdn.net/m0_72734364/article/details/134466898