• OpenCV图像处理——卷积操作


    总目录

    图像处理总目录←点击这里

    二十五、卷积操作

    25.1、预处理

    # 指定输入图像
    ap = argparse.ArgumentParser()
    ap.add_argument("-i", "--image", required=True, help="path to the input image")
    args = vars(ap.parse_args())
    
    # 分别构建两个卷积核
    smallBlur = np.ones((7, 7), dtype="float") * (1.0 / (7 * 7))
    largeBlur = np.ones((21, 21), dtype="float") * (1.0 / (21 * 21))
    
    # 尝试不同的卷积核
    sharpen = np.array((
        [0, -1, 0],
        [-1, 5, -1],
        [0, -1, 0]), dtype="int")
    
    laplacian = np.array((
        [0, 1, 0],
        [1, -4, 1],
        [0, 1, 0]), dtype="int")
    
    sobelX = np.array((
        [-1, 0, 1],
        [-2, 0, 2],
        [-1, 0, 1]), dtype="int")
    
    sobelY = np.array((
        [-1, -2, -1],
        [0, 0, 0],
        [1, 2, 1]), dtype="int")
    
    # 尝试不同结果
    kernelBank = (
        ("small_blur", smallBlur),
        ("large_blur", largeBlur),
        ("sharpen", sharpen),
        ("laplacian", laplacian),
        ("sobel_x", sobelX),
        ("sobel_y", sobelY)
    )
    
    # 简单起见,用灰度图来玩
    image = cv2.imread(args["image"])
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    • 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
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43

    25.2、手动卷积

    卷积函数

    def convolve(image, kernel):
        # 输入图像和核的尺寸
        (iH, iW) = image.shape[:2]
        (kH, kW) = kernel.shape[:2]
    
        # 选择pad,卷积后图像大小不变
        pad = (kW - 1) // 2
        # 重复最后一个元素,top, bottom, left, right
        image = cv2.copyMakeBorder(image, pad, pad, pad, pad,
                                   cv2.BORDER_REPLICATE)
        output = np.zeros((iH, iW), dtype="float32")
    
        # 卷积操作
        for y in np.arange(pad, iH + pad):
            for x in np.arange(pad, iW + pad):
                # 提取每一个卷积区域
                roi = image[y - pad:y + pad + 1, x - pad:x + pad + 1]
    
                # 内积运算
                k = (roi * kernel).sum()
    
                # 保存相应的结果
                output[y - pad, x - pad] = k
    
        # 将得到的结果放缩到[0, 255]
        output = rescale_intensity(output, in_range=(0, 255))
        output = (output * 255).astype("uint8")
    
        return output
    
    • 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
    # 遍历每一个核
    for (kernelName, kernel) in kernelBank:
        print("[INFO] applying {} kernel".format(kernelName))
        convoleOutput = convolve(gray, kernel)
    
        # 分别展示结果
        cv2.imshow("original", gray)
        cv2.imshow("{} - convole".format(kernelName), convoleOutput)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    25.3、OpenCV卷积

    cv2.filter2D(gray, -1, kernel)

    # 遍历每一个核
    for (kernelName, kernel) in kernelBank:
        print("[INFO] applying {} kernel".format(kernelName))
        # -1 表示深度一致
        opencvOutput = cv2.filter2D(gray, -1, kernel)
    
        # 分别展示结果
        cv2.imshow("original", gray)
        cv2.imshow("{} - opencv".format(kernelName), opencvOutput)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    25.4、两种卷积对比

    对比

    • OpenCV是一个开源的C++实现的计算机视觉库

      • 包含主要的图像处理和计算机视觉的算法
      • 包含简单的机器学习
      • 包含深度dnn网络模块(不能训练,只能做检测,forward)
    • 卷积神经网络(CNN)是一种网络结构

    因此opencv没必要实现卷积神经网络的训练

    模型

    最新版opencv支持的模型

    • tensorflow
    • pytorch
    • caffe
    • DarkNet

    效果对比

    原图:

    在这里插入图片描述

    3X3的的卷积核

    在这里插入图片描述

    7X7的卷积核

    在这里插入图片描述

    图形锐化sharpen

    在这里插入图片描述

    laplcian算子

    在这里插入图片描述

    sobel-x算子(横向)

    在这里插入图片描述

    sobel-y算子(纵向)

    在这里插入图片描述

  • 相关阅读:
    Lombok依赖
    产品质量模型
    小小的孜然居然有这么多好处,可别再忽视了
    PROFINET通信介绍
    浮点数内存存储问题
    汽车射频之基础
    华为静态路由配置实验(超详细讲解+详细命令行)
    金枪鱼群优化算法(Matlab代码实现)
    java boolean占用内存是多少
    【Node.js】path模块处理路径问题
  • 原文地址:https://blog.csdn.net/weixin_44635198/article/details/128146220