Я пытаюсь анализировать полутоновую TIFF стеку, в которых данный кадр будет выглядеть как это. Я фильтрую его (используя размытие по Гауссу), а затем бинаризую его (используя метод 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, чтобы получить размеры вычислений, но я изо всех сил пытался найти еще один. Было бы здорово иметь версию этого кода на Python, если бы я мог найти хорошую замену функции Matlab bwconncomp
.
Что-то вроде этого?
from skimage.io import imread, imshow
from skimage.filters import gaussian, threshold_otsu
from skimage import measure
import matplotlib.pyplot as plt
original = imread('https://i.stack.imgur.com/nkQpj.png')
blurred = gaussian(original, sigma=.8)
binary = blurred > threshold_otsu(blurred)
labels = measure.label(binary)
plots = {'Original': original, 'Blurred': blurred,
'Binary': binary, 'Labels': labels}
fig, ax = plt.subplots(1, len(plots))
for n, (title, img) in enumerate(plots.items()):
cmap = plt.cm.gnuplot if n == len(plots) - 1 else plt.cm.gray
ax[n].imshow(img, cmap=cmap)
ax[n].axis('off')
ax[n].set_title(title)
plt.show(fig)
props = measure.regionprops(labels)
for prop in props:
print('Label: {} >> Object size: {}'.format(prop.label, prop.area))
Выход:
Label: 1 >> Object size: 37
Label: 2 >> Object size: 66
Label: 3 >> Object size: 1
measure.label
?