我最近一直在为角膜分割过程 内皮细胞,我发现了一篇相当不错的论文,描述了如何以良好的效果执行它。我一直在尝试使用scikit-image和openCV来实现这一切,但我已经陷入了分水岭分割。
我将简要介绍该过程应该如何:
首先,你有原始的内皮细胞图像 original image
然后,他们指示你进行形态灰度重建,以便稍微调整图像的灰度(但是,他们没有解释如何获得灰度标记,所以我已经鬼混,并试图以自己的方式得到一些)
重建图像应该是这样的: desired reconstruction
这是我重建的图像(让我们将其标记为 r )看起来像: my reconstruction
目的是使用重建的图像来获得分水岭分割的标记,我们该怎么做?!我们得到原始图像(将其标记为 f ),并在(
这就是hdomes图像应该是这样的: desired hdomes
这是我的hdomes图片的样子: my hdomes
我相信我得到的hdomes和他们一样好,所以,最后一步是最终对原始图像执行分水岭分割,使用我们一直努力工作的hdomes搞定!
作为输入图像,我们将使用反转的原始图像,并作为标记,使用我们的标记。
这是侮辱的输出:
然而,我只是得到一张黑色的图像,每个像素都是黑色的,我不知道发生了什么......我也试过使用他们的标记和倒像,但是,也得到了黑色图像。我一直在使用的论文是 Luc M. Vincent,Barry R. Masters,"角膜内皮细胞图像的形态学图像处理和网络分析",Proc。 SPIE 1769
我为长篇文章道歉,但是我真的想详细解释到目前为止我的理解是什么,顺便说一下,我已尝试过scikit-image和opencv的分水岭分割,两者都给了我黑色图像。
以下是我一直在使用的代码
img = cv2.imread('input.png',0)
mask = img
marker = cv2.erode(mask, cv2.getStructuringElement(cv2.MORPH_ERODE,(3,3)), iterations = 3)
reconstructedImage = reconstruction(marker, mask)
hdomes = img - reconstructedImage
cell_markers = cv2.threshold(hdomes, 0, 255, cv2.THRESH_BINARY)[1]
inverted = (255 - img)
labels = watershed(inverted, cell_markers)
cv2.imwrite('test.png', labels)
plt.figure()
plt.imshow(labels)
plt.show()
谢谢!
答案 0 :(得分:1)
以下是使用scikit-image对图像进行分水岭分割的粗略示例。
您的脚本中缺少的是计算欧几里德距离(请参阅here和here)并从中提取局部最大值。
注意,分水岭算法输出分段恒定图像,其中相同区域中的像素被赋予相同的值。您所希望的输出中显示的内容'面板(e)是区域之间的边缘。
import numpy as np
import cv2
import matplotlib.pyplot as plt
from skimage.morphology import watershed
from scipy import ndimage as ndi
from skimage.feature import peak_local_max
from skimage.filters import threshold_local
img = cv2.imread('input.jpg',0)
'''Adaptive thersholding
calculates thresholds in regions of size block_size surrounding each pixel
to handle the non-uniform background'''
block_size = 41
adaptive_thresh = threshold_local(img, block_size)#, offset=10)
binary_adaptive = img > adaptive_thresh
# Calculate Euclidean distance
distance = ndi.distance_transform_edt(binary_adaptive)
# Find local maxima of the distance map
local_maxi = peak_local_max(distance, labels=binary_adaptive, footprint=np.ones((3, 3)), indices=False)
# Label the maxima
markers = ndi.label(local_maxi)[0]
''' Watershed algorithm
The option watershed_line=True leave a one-pixel wide line
with label 0 separating the regions obtained by the watershed algorithm '''
labels = watershed(-distance, markers, watershed_line=True)
# Plot the result
plt.imshow(img, cmap='gray')
plt.imshow(labels==0,alpha=.3, cmap='Reds')
plt.show()