用cv2区分彼此靠近的噪声物体

问题描述 投票:0回答:1

我有一个包含噪声对象的图像,我想用 OpenCV 来区分它们。这是图片:

我的代码应该检测图像中的三个白点。所以输出应该是这样的(左)。然而,这两个噪声点彼此非常接近,以至于代码将它们视为一个大对象(右):

这是我的代码:

import cv2
import tkinter.filedialog as fd

def process(image):
    bil = cv2.bilateralFilter(image, 20, 75, 175, cv2.BORDER_REFLECT)
    grey = cv2.cvtColor(bil, cv2.COLOR_BGR2GRAY)
    bw = cv2.threshold(grey, 0, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
    return bw

def main():
    filepath = fd.askopenfilename()
    image = cv2.imread(filepath)
    final = process(image)
    cv2.imshow("Image", final)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

main()

我还没能解决这个问题。我遇到了一个叫做 CLAHE 的东西,我尝试创建一个函数,但这不能正常工作:

def use_clahe(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    clahe = cv2.createCLAHE(clipLimit=5)
    apply_clahe = clahe.apply(gray)
    dots = apply_clahe + 30
    bw = cv2.threshold(dots, 0, 255, cv2.THRESH_BINARY|cv2.THRESH_OTSU)[1]
    return bw

这会创建一个包含大量噪声的图像,并且这些点被标记为黑色。但是,我希望它们是白色的,背景应该是全黑的。我该如何解决这个问题?

python opencv image-processing computer-vision
1个回答
0
投票

当您的问题很简单时,无需复杂的解决方案。您的图像在您想要和您不想要之间形成了巨大的反差。

在我眼里这样的东西就足够了:

im = cv2.imread("dots.jpg") # read image
imGray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY) # convert to gray
mask = imGray>240 # get mask
plt.imshow(mask) # show the mask

结果:

如果您需要从图像中获取像素,请使用:

imFiltered = cv2.bitwise_and(im, im, mask=mask.astype(np.uint8)) # filter

如果您需要这些检测到的斑点周围的像素,请使用膨胀:

mask = cv2.dilate(mask.astype(np.uint8), np.ones((3,3),dtype=np.uint8), iterations = 1)
© www.soinside.com 2019 - 2024. All rights reserved.