我有一个包含噪声对象的图像,我想用 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
这会创建一个包含大量噪声的图像,并且这些点被标记为黑色。但是,我希望它们是白色的,背景应该是全黑的。我该如何解决这个问题?
当您的问题很简单时,无需复杂的解决方案。您的图像在您想要和您不想要之间形成了巨大的反差。
在我眼里这样的东西就足够了:
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)