python - 在 python 中用 cv2 填充图像的 "holes"不起作用

标签 python opencv image-processing

我试图在执行二进制阈值后填充图像中红细胞的“孔”。反转二进制阈值时,几乎所有的红细胞都有一个黑色的中心。我想删除它们。

示例图片:

Example image


这是我的代码:

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))

我试图分割每个单元格,但结果很不理想。只有有“洞”的细胞内部被分割。

第一张图片显示了我的结果,第二张显示了它的大致样子:

First image shows my result, second shows how it should roughly look like .

然后我手动填充了这些洞,只是为了看看我的分割代码是否有效——而且它确实有效。错误应该在我绘制轮廓的部分和我计算欧氏距离的部分之间的某个地方。任何人都可以向我解释什么可能是错的吗?我一无所知。

最佳答案

您的问题出在以下行:

labels = watershed(-D, markers, mask=thresh)

您将阈值处理的反转、未校正结果作为掩码传递:

Bad mask

给你这个糟糕的分割:

bad result

鉴于您应该通过更正后的填充掩码:

labels = watershed(-D, markers, mask=newimg)

Good mask

给你你可能期望的结果:

good result

关于python - 在 python 中用 cv2 填充图像的 "holes"不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36438313/

相关文章:

java - 在java中合并两个图像

python - 在任意导入函数内调用 globals() 函数?

python - 用于 python 日志级别和调试级别的 Google api 客户端不起作用

opencv - 如何测试头部Pose代码

c++ - 在 iPhone 中裁剪图像的 Opencv 错误

c++ - 为什么我的 .exe 文件崩溃,但在调试和发布版本中工作正常?

python - 类型错误: 'float' 对象不可迭代,Python 列表

python - 非法指令 : 4 when importing python plugins

python - 了解图像中是否有任何像素为白色的有效方法?

c++ - 从像素标签创建 RGB 图像