python - 为什么我们在 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?内核的值不应该以任何方式影响卷积,对吧?
解决方案
您将内核值乘以像素值。如果全为 0,则输出为 0。如果不为 1,则输出将被您放入 kernel 中的值放大。它是 1,保持像素值不变,ALL 1,因为这就是侵蚀过滤器的作用。内核通常是 1,0,-1 的组合,具体取决于内核的目标。因此,在您的示例中,5x5 1s 的内核乘以 5x5 子图像(我认为它是像素值的总和)。
推荐阅读
- linux - CAN socketCAN - 文件传输的可靠性如何
- python - 如何在 Docker 中安装模块(Selenium、Python)
- scrum - icescrum 具有值的字段 startDate 不遵守自定义验证
- postgresql - 可以从父母那里继承的 Postgres 父子行级安全性?
- symfony - 脚本启动时的 Symfony 5 教义迁移错误
- sql - 比较两个表并使用 SQL Server 过程在第三个表中插入所有具有添加或删除状态的记录
- three.js - 3d-force-graph 和 Three.js - 为单个节点和节点组添加几何发光/大气材质/简单纹理
- ios - 核心数据错误:在范围内没有 NSManagedObjectContext 时无法获取
- excel - 在vba中使用带有多个条件的if语句循环遍历给定范围内的每一行
- json - 如何使用 Azure ARM 模板从 keyvault 传递秘密值