• 可分离卷积核


      在图像处理中,卷积操作是一种常用的技术,可分离卷积核(Separable Convolution Kernel)是一种特殊类型的卷积核,其可以分解成水平和垂直两个单独的核函数,这种分解使得卷积计算变得更加高效。

    原理和作用:

      一般的卷积核是一个二维矩阵,应用它需要对每一个像素点进行两个维度上的遍历,这可能会导致计算量较大。可分离卷积核的原理在于,某些卷积核可以分解为两个一维核的乘积,即水平核和垂直核。
      例如,一个二维卷积核可以分解为两个一维核的卷积:
      假设有一个二维卷积核为 K K K,可以分解成两个一维核 K h K_h Kh(水平核)和 K v K_v Kv(垂直核),它们的乘积等于原始的二维卷积核 K K K。这样,对图像进行卷积操作时,可以先应用水平核 K h K_h Kh,然后再应用垂直核 K v K_v Kv,这样就可以用两个一维卷积来代替一个二维卷积,从而减少了计算量。

    应用场景:

      可分离卷积核的主要优势在于计算效率的提高。在一些图像处理任务中,比如边缘检测、模糊、锐化等,当卷积核是可分离的情况下,使用可分离卷积核能够加快处理速度,降低计算复杂度。

    数学公式:

      二维卷积核 K K K 可以分解为两个一维核 K h K_h Kh K v K_v Kv的乘积:
    K = K h ⋅ K v T K = K_h \cdot K_v^T K=KhKvT
      其中, K h K_h Kh是大小为 1 × m 1 \times m 1×m的水平核, K v K_v Kv 是大小为 n × 1 n \times 1 n×1 的垂直核。符号 T T T表示转置。

    代码示例(Python,使用OpenCV):

    import cv2
    import numpy as np
    
    
    def ker_h_v(image):
        # 创建一个二维卷积核
        kernel_2d = np.array([[1, 2, 1],
                              [2, 4, 2],
                              [1, 2, 1]], dtype=np.float32) / 16  # 一个示例的二维卷积核
    
        # 分解成水平核和垂直核
        kernel_h = np.array([1, 2, 1], dtype=np.float32) / 4  # 水平核
        kernel_v = np.array([[1], [2], [1]], dtype=np.float32) / 4  # 垂直核
    
        # 使用分解后的核进行卷积
        convolved_h = cv2.filter2D(image, -1, kernel_h)  # 水平核卷积
        convolved_final = cv2.filter2D(convolved_h, -1, kernel_v)  # 垂直核卷积
    
        convolved_final_ori=cv2.filter2D(image,-1,kernel_2d)
    
        return convolved_final
    
    def show_images(image):
        cv2.namedWindow('image',cv2.WINDOW_KEEPRATIO)
        cv2.imshow('image',image)
        cv2.waitKey()
        cv2.destroyAllWindows()
    
    if __name__ == '__main__':
        # 读取图像
        image = cv2.imread('cat-dog.png', flags=0)
        result=ker_h_v(image)
        show_images(result)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

      这个示例演示了如何将一个二维卷积核分解成水平核和垂直核,并使用 OpenCV 中的 filter2D 函数进行图像的可分离卷积操作。这样做可以大幅度提高卷积操作的效率,特别是对于大尺寸的卷积核和大图像,通过分解核可以更快地完成卷积运算。

  • 相关阅读:
    SQL 入门指南:从零开始学习 SQL
    [网络工程师]-网络层协议-IPv6协议
    HTML期末作业 计算机毕业设计 html css javascript食品餐饮行业网站(10页)
    消息队列这么多,用哪个哟?
    Python每日一练 05
    Firefly RK3399 PC pro Android 10下载验证
    建筑可视化中的 3D 纹理
    云计算修罗场
    vite +vue3-ts架构,我要打包的时候打包成压缩包zip文件
    FlinkSql中的聚合查询
  • 原文地址:https://blog.csdn.net/qq_50993557/article/details/134427724