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)

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
# 遍历每一个核
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()

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()

25.4、两种卷积对比

对比

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

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

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

模型

最新版opencv支持的模型

  • tensorflow
  • pytorch
  • caffe
  • DarkNet

效果对比

原图:

在这里插入图片描述

3X3的的卷积核

在这里插入图片描述

7X7的卷积核

在这里插入图片描述

图形锐化sharpen

在这里插入图片描述

laplcian算子

在这里插入图片描述

sobel-x算子(横向)

在这里插入图片描述

sobel-y算子(纵向)

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44635198/article/details/128146220