重叠细胞的分割

时间:2018-01-27 23:09:14

标签: python-2.7 opencv image-processing

以下python脚本应该将重叠的单元分开,这确实很有效。现在的问题是它还将一些细胞分开,这些细胞不与其他细胞重叠。为了让你清楚,我将添加输入图像和输出图像。

输入:input image

输出: output image

输出图像,其中我标记了两个“坏”分段单元格:Output image with marked errors

阈值图片:Thresholded image

有人知道如何避免这个问题,还是整个方法不足以处理这类图像?

我正在使用以下代码来细分细胞:

from skimage.feature import peak_local_max
from skimage.morphology import watershed
from scipy import ndimage
import numpy as np
import cv2


# load the image and perform pyramid mean shift filtering
# to aid the thresholding step
image = cv2.imread('C:/Users/Root/Desktop/image13.jpg')
shifted = cv2.pyrMeanShiftFiltering(image, 41, 51)

# convert the mean shift image to grayscale, then apply
# Otsu's thresholding
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255,
    cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]
im = gray.copy()    
D = ndimage.distance_transform_edt(thresh)
localMax = peak_local_max(D, indices=False, min_distance=3,  
    labels=thresh)
# perform a connected component analysis on the local peaks,
# using 8-connectivity, then apply the Watershed algorithm
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))

conts=[]    
for label in np.unique(labels):
    # if the label is zero, we are examining the 'background'
    # so simply ignore it
    if label == 0:
        continue
    # otherwise, allocate memory for the label region and draw
    # it on the mask
    mask = np.zeros(gray.shape, dtype="uint8")
    mask[labels == label] = 255
    # detect contours in the mask and grab the largest one
    cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL,
        cv2.CHAIN_APPROX_SIMPLE)[-2]
    c = max(cnts, key=cv2.contourArea)
    rect = cv2.minAreaRect(c)
    box = cv2.boxPoints(rect)
    box = np.int0(box)  
    if cv2.contourArea(c) > 150: 
        #cv2.drawContours(image,c,-1,(0,255,0))
        cv2.drawContours(image,[box],-1,(0,255,0))      
cv2.imshow("output", image)
cv2.waitKey()

0 个答案:

没有答案