我试图在执行二进制阈值后填充图像中红细胞的“孔”。反转二进制阈值时,几乎所有的红细胞都有一个黑色的中心。我想删除它们。
示例图片:
这是我的代码:
import cv2
from PIL import Image
import numpy as np
from scipy import ndimage
from skimage.feature import peak_local_max
from skimage.morphology import watershed
image = cv2.imread("blood_cells.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
darker = cv2.equalizeHist(gray)
ret,thresh = cv2.threshold(darker,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
newimg = cv2.bitwise_not(thresh)
im2, contours, hierarchy = cv2.findContours(newimg,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
cv2.drawContours(newimg,[cnt],0,255,-1)
它奏效了。我使用 findContours()
和 drawContours()
填充了孔。
但是当我尝试计算欧几里得距离时,为了应用分水岭算法,我只得到 52 个独特的段,但应该有更多。这是代码,如果它可能有帮助的话:
D = ndimage.distance_transform_edt(newimg)
localMax = peak_local_max(D, indices=False, min_distance=20, labels=thresh)
markers = ndimage.label(localMax, structure=np.ones((3, 3)))[0]
labels = watershed(-D, markers, mask=thresh)
print("[INFO] {} unique segments found".format(len(np.unique(labels)) - 1))
我试图分割每个单元格,但结果很不理想。只有有“洞”的细胞内部被分割。
第一张图片显示了我的结果,第二张显示了它的大致样子:
.
然后我手动填充了这些洞,只是为了看看我的分割代码是否有效——而且它确实有效。错误应该在我绘制轮廓的部分和我计算欧氏距离的部分之间的某个地方。任何人都可以向我解释什么可能是错的吗?我一无所知。
最佳答案
您的问题出在以下行:
labels = watershed(-D, markers, mask=thresh)
您将阈值处理的反转、未校正结果作为掩码传递:
给你这个糟糕的分割:
鉴于您应该通过更正后的填充掩码:
labels = watershed(-D, markers, mask=newimg)
给你你可能期望的结果:
关于python - 在 python 中用 cv2 填充图像的 "holes"不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438313/