cv2 - 如何使用opencv获取图像中组件的周长?
问题描述
我有以下矩阵:
m = np.asarray(
[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
[0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0],
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
], dtype=np.uint8
)
我应用了以下几个渐变变换:
gradient = cv2.morphologyEx(m, cv2.MORPH_GRADIENT, np.ones((2,2),np.uint8))
gradient = cv2.morphologyEx(m, cv2.MORPH_GRADIENT, np.ones((3,3),np.uint8))
我分别得到以下结果:
我所期待的是与图像相反的;有没有一种简单的、万无一失的方法来获取周边?
解决方案
OpenCV 应用梯度变换的方式似乎存在错误。
通过运行以下命令,我能够获得正确的结果:
something = cv2.morphologyEx(m, cv2.MORPH_GRADIENT, np.ones((3,3),np.uint8))
gradient = something - m
gradient[gradient > 1] = 0
小心复制我的答案,以便结果矩阵中的数字是您需要的数字。
推荐阅读
- arrays - 多个结果的 Vlookup 最大值/最小值
- c++ - 可以将“bool”转换为“const char”错误并错位else错误c ++
- angular - 角度弹簧启动应用程序的错误 415 不受支持的媒体类型
- php - 在控制器中执行该方法一次并且不更新
- python - 检查输入时出现此错误错误:预期 conv2d_2_input 有 4 个维度,但在打开的 cv2 中得到了形状为 (717, 50, 50) 的数组
- arduino - 我可以以某种方式在按钮或模式中的某处将此代码添加到该代码中吗?
- blender - 有没有办法在搅拌机 2.8 2d 动画工作区中设置和更新背景图像?
- c++ - std::cout 的简约重新实现
- reactjs - 如何将令牌存储在 React 库的 LocalStorage 中
- c++ - 如何在不区分大小写的情况下检查文本文件是否为回文