python - 如何从 opencv 的 morhpologyEx 获得关于图像边界的预期行为?
问题描述
我正在使用 opencv(版本 4.1.0,带有 Python 3.7)对二进制图像执行形态关闭。使用大的关闭内核时,我遇到了边界问题。
我的代码是:
close_size = 20
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (close_size, close_size))
result = cv2.morphologyEx(im, cv2.MORPH_CLOSE, kernel)
我读了这个问题和这个问题,还有文档,这导致我也尝试
像这样改变borderValue
论点morphologyEx()
result = cv2.morphologyEx(im, cv2.MORPH_CLOSE, kernel,borderValue=[cv2.BORDER_CONSTANT,0])
但是这两种方法都不会导致我想要的。我在下图中总结了他们的行为。
我的原始图像在顶部。我期望的行为是两个点对于小内核(例如,内核 = 1)保持分离,并为足够大的内核合并在一起。
如您所见,对于默认边界(图像的左列),当 kernel = 6 时合并是正确的,但是一旦它变大,点就开始与边界合并。
使用恒定的边界(图像的右列),可以使用更大的内核,但是对于非常大的内核(例如内核 = 20),仍然会发生意外行为,其中点消失。
关闭内核作为最终软件中的用户参数保留,以便能够合并可能非常远的点。所以理想情况下,我需要能够处理比对象和边界之间的距离更大的平滑内核。
解决方案
这个答案解释了如何MORPH_CLOSE
通过向图像添加缓冲区来使用图像边缘。
您可以通过使用 numpy 创建零图像来添加缓冲区:
# Import packages
import cv2
import numpy as np
import matplotlib.pyplot as plt
# Read in the image
img = cv2.imread('/home/stephen/Desktop/OKoUh.png', 0)
# Create a black bufffer around the image
h,w = img.shape
buffer = max(h,w)
bg = np.zeros((h+buffer*2, w+buffer*2), np.uint8)
bg[buffer:buffer+h, buffer:buffer+w] = img
然后您可以迭代并检查它在不同内核大小下的外观:
for close_size in range(1,11):
temp = bg.copy()
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (close_size, close_size))
result = cv2.morphologyEx(temp, cv2.MORPH_CLOSE, kernel)
results = result[buffer:buffer+h, buffer:buffer+w]
cv2.imshow('img', result)
cv2.waitKey()
推荐阅读
- ruby-on-rails - 无法测试 AASM gem 引发的错误
- c# - 在 WinForms 经典桌面应用程序中获取 CoreDispatcher
- ios - iOS Swift 日期选择器选择下一个间隔
- javascript - 如何使用函数实例化空对象中的值
- delphi - Delphi,在 TPointerlist() 处编辑 Tenumstring 中的自动完成访问冲突
- python - 自动将本地目录中的文件上传到 Azure 存储资源管理器 blob 存储
- amazon-web-services - AWS Dynamodb BatchGet 与 FilterExpression
- python - 将列表中整数的差异与给定值进行比较
- python - 使用数据框中的值进行索引
- c# - 如何将文件保存到我的项目文件夹 c#