python - 如何从opencv的morhpologyEx获得有关图像边界的预期行为?

标签 python opencv image-processing image-morphology

我正在使用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)

我读了this questionthis question以及the docs,这导致我也尝试更改
像这样borderValue中的morphologyEx()参数
result = cv2.morphologyEx(im, cv2.MORPH_CLOSE, kernel,borderValue=[cv2.BORDER_CONSTANT,0])

但是两种方法都无法达到我想要的效果。我在下图中总结了他们的行为。

enter image description here

我的原始图片在最上面。我期望的行为是,对于小内核(例如,kernel = 1),两个点保持分离,并为足够大的内核合并在一起。
如您所见,对于默认边框(图像的左列),当内核= 6时,合并是正确的,但是一旦内核变大,点就会开始与边界合并。
在边界不变的情况下(图像的右列),可以使用更大的内核,但是在真正更大的内核(例如,kernel = 20)下仍会​​出现意外行为,这些问题会消失。

在最终软件中,关闭的内核留给用户作为参数,以便能够合并可能真的很远的点。因此,理想情况下,我将需要能够平滑处理真正大于对象与边界之间距离的内核。

原始图片:
enter image description here

最佳答案

该答案说明了如何通过向图像边缘添加缓冲区来在图像边缘使用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()

我的结果:
results

关于python - 如何从opencv的morhpologyEx获得有关图像边界的预期行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59199763/

相关文章:

python - 在 PyQt4 中动态更改 QLabel 文本

python - sklearn DecisionTreeClassifier 中 min_samples_split 和 min_samples_leaf 的区别

c++ - OpenCV 2.3 SURF关键点倍频程永远不等于0

matlab - 如何将 RGB 图像转换为灰度图像但保留一种颜色?

python - 在 HSV 颜色空间(Python、OpenCV、图像分析)中定义组织学图像掩码的颜色范围 :

javascript - 使用 Python 请求模拟 ajax POST 调用

c++ - 如何比较 opencv 中的两个边缘图像(不是 matchShapes)

opencv - 如何在ubuntu(或其他linux env)中将realsense RGB帧转换为cv::Mat?

c++ - OpenCV - 用于边缘图(不是轮廓)的 approxPolyDP

java - 有哪些好的java图像处理工具或API?