首页 > 解决方案 > 为什么我们在 OpenCV 中使用一个数组作为内核?

问题描述

今天在阅读 OpenCV 文档时,我遇到了一组有趣的函数,称为形态变换。虽然,我觉得我对腐蚀和膨胀的概念有很好的掌握,但我无法理解为什么我们在执行形态变换时使用 1 的数组。例如,请参阅下面的代码(引用自Open CV 文档,作者在执行腐蚀时创建了一个填充有内核的内核。

import cv2
import numpy as np

img = cv2.imread('j.png',0)
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(img,kernel,iterations = 1)

经过一些研究,我了解到腐蚀的基本工作原理只是一个 2D 卷积,其中将相关像素与相邻像素进行比较,并将内核下方图片的局部最小值设置为像素的值。然而,这并不能帮助我澄清为什么我们首先将内核设置为持有一个。为什么不是0?为什么不是255?内核的值不应该以任何方式影响卷积,对吧?

标签: pythonnumpyopencv

解决方案


您将内核值乘以像素值。如果全为 0,则输出为 0。如果不为 1,则输出将被您放入 kernel 中的值放大。它是 1,保持像素值不变,ALL 1,因为这就是侵蚀过滤器的作用。内核通常是 1,0,-1 的组合,具体取决于内核的目标。因此,在您的示例中,5x5 1s 的内核乘以 5x5 子图像(我认为它是像素值的总和)。


推荐阅读