填充"孔" python中的图像与cv2不工作

时间:2016-04-05 22:38:53

标签: 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

然后我手动填充漏洞,只是为了查看我的分段代码是否有效 - 并且它有效。错误应该介于我绘制轮廓的部分和我计算欧氏距离的部分之间。任何人都可以向我解释什么可能是错的?我很无能为力。

1 个答案:

答案 0 :(得分:3)

您的问题在于以下几行:

MediaController mediaController = new MediaController(this);
        mediaController.setAnchorView(vidFull);
        vidFull.setMediaController(mediaController);
        vidFull.setVideoPath(videoPath);
        vidFull.requestFocus();
        vidFull.start();

你作为面具传递了来自阈值的倒置,未校正的结果:

Bad mask

给你这个糟糕的细分:

bad result

而你应该传递更正的,填充的面具:

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

Good mask

给你你可能期望的结果:

good result