我正在尝试分析灰度TIFF堆栈,在这些堆栈中,给定的帧看起来像this。我对其进行过滤(使用高斯模糊),然后将其二值化(使用Otsu的阈值方法)。
MATLAB代码,它工作得很好:
image_conncomp = bwconncomp(image_binary); # entire stack is held in image_binary
for i=1:image_conncomp.NumObjects
object_size = length(image_conncomp.PixelIdxList{i});
end
示例图像中的每个白点都会被拾取,其体积(以像素为单位)由object_size
非常准确地给出。
Python代码:
from skimage import measure
labels = measure.label(image_binary, background=1) # same image_binary as above
propsa = measure.regionprops(labels)
for label in propsa:
object_size = len(label.coords)
Python代码似乎工作得很好……除了大多数检测到的对象的object_size
将为1- 200,然后少数几个对象的大小将为数千像素。
这些函数有哪些不同之处?我很乐意尝试Python中的另一种方法来计算对象大小,但我很难找到另一种方法。如果我能找到一个很好的方法来替代Matlab的bwconncomp
函数,那么能有一个Python版本的代码就太好了。
发布于 2019-10-20 18:47:58
我们可以通过首先在阈值二值图像上应用scipy.ndimage
的形态关闭,然后使用label()
函数合并二值图像中的连接区域来完成相同的操作,如下所示(区域的大小略有不同,将取决于形态内核的大小):
from scipy.ndimage import label
from scipy.ndimage.morphology import binary_closing
from skimage.filters import threshold_otsu
import matplotlib.pylab as plt
original = plt.imread('https://i.stack.imgur.com/nkQpj.png')
thres = threshold_otsu(original)
binary = original > thres
binary_closed = binary_closing(binary, structure=np.ones((2,2)))
labeled_image, num_features = label(binary_closed)
feature_areas = np.bincount(labeled_image.ravel())[1:]
print(feature_areas) # if we use 3x3 SE we shall get two regions with areas 24, 46
# [24 42 1]
plt.figure(figsize=(8,7))
plt.gray()
plt.subplot(221), plt.imshow(original), plt.axis('off'), plt.title('original')
plt.subplot(222), plt.imshow(binary), plt.axis('off'), plt.title('binray')
plt.subplot(223), plt.imshow(binary_closed), plt.axis('off'), plt.title('binray closed')
plt.subplot(224), plt.imshow(labeled_image, cmap='inferno'), plt.axis('off'), plt.title('labelled')
plt.show()
要获得以下输出:
https://stackoverflow.com/questions/51249781
复制相似问题