是否有一个功能可以清理opencv中的图像,相当于
bwmorph(image,'clean');
在 matlab 中??clean 函数根据 MATLAB 删除孤立像素(1 被 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++。