0

是否有一个功能可以清理opencv中的图像,相当于

bwmorph(image,'clean'); 

在 matlab 中??clean 函数根据 MA​​TLAB 删除孤立像素(1 被 0 包围)。

4

2 回答 2

0

我认为,诸如侵蚀之类的形态学操作将适用于您的问题。

OpenCV 腐蚀扩张示例

OpenCV 更多形态学运算

于 2013-10-02T13:03:01.280 回答
0

根据定义,简单地使用 Erode-Dilate 不会产生与 bwmorph(image,'clean') 完全相同的效果。根据其文档,清洁方法:

删除孤立的像素(被 0 包围的单个 1),例如此模式中的中心像素。

我找不到等效的实现,然后我使用本网站上共享的关于 openCV 和 python 的核心逻辑来实现它。

这是我的实现:

from skimage.exposure import rescale_intensity
import numpy as np
import cv2
def bwmorphClean(image):
    (iH, iW) = image.shape[:2]
    pad = 1
    image = cv2.copyMakeBorder(image, pad, pad, pad, pad, cv2.BORDER_REPLICATE)
    output = np.zeros((iH, iW), dtype="float32")

    for y in np.arange(pad, iH + pad):
        for x in np.arange(pad, iW + pad):
            roi = image[y - pad:y + pad + 1, x - pad:x + pad + 1]

            if roi[0,0] == roi[1,0] == roi [2,0] == roi [0,1] == roi [0,2] == roi [1,2] == roi [2,1] == roi [2,2] == 0:
                output[y - pad, x - pad] = 0
            else:
                output[y - pad, x - pad] = roi[1,1]

    output = rescale_intensity(output, in_range=(0, 255))
    output = (output * 255).astype("uint8")

    return output

我知道您使用了“c++”标签,但我相信以我的代码为例,您可以轻松地将其转换为 c++。

于 2018-04-02T13:36:29.577 回答