Метрика для вогнутости объектов в скимаге или вообще в питоне - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть код, где в какой-то момент я получаю набор двумерных двоичных массивов numpy для представления объектов, которые в основном представляют собой эллипсы и круги (ядра клеток)

Мне нужна метрика о том, насколько грубо(неровные) края .В патологической литературе есть индекс ядерного контура: периметр / площадь (площадь), это работает, но в нашем случае нам нужно конкретно посмотреть, насколько «шероховат» периметр.Индексы ядерного контура эллипса и круга различны, даже если оба имеют гладкие края. В нашем случае круг с неровным краем гораздо важнее, чем эллипс с гладким краем .

Я думал об использовании выпуклой оболочки, объясненной здесь : я думаю, что в этомслучай, если метрика будет такой же, как для многих незначительных вогнутостей (что является для нас значимым случаем) и одной большой вогнутости (что не так существенно), как на рисунках ниже. enter image description here

Я также попробовал openCV, однако мне было трудно математически понять, что на самом деле там происходит, и это очень похоже на выпуклый корпус лыжного мага, и я бы предпочел придерживаться лыжного мага

1 Ответ

0 голосов
/ 10 февраля 2019

Я думаю, твердость (т. Е. Отношение пикселей в объекте к пикселям выпуклой оболочки) может быть хорошим показателем для начала ваших испытаний.Его можно вычислить простым способом с помощью функции skimage.measure.regionprops.Результаты, которые я получил, используя этот подход, показаны ниже:

solidity

Если этот показатель не подходит для вашего приложения, вы можете попробовать компактность круговая дисперсия .Взгляните здесь для всесторонней компиляции морфологических признаков.

Это код, который я использовал для генерации игрушечного примера выше:

import numpy as np
from skimage import io, draw, transform, measure
import matplotlib.pyplot as plt

N = 512
rr, cc = draw.circle(r=N/2, c=N/2, radius=N/3, shape=(N, N))
steps = [4, 16, 32]
smooth = np.zeros(shape=(N, N), dtype=np.uint8)
smooth[rr, cc] = 255

fig, ax = plt.subplots(1, len(steps), figsize=(12, 5))

for i, s in enumerate(steps):
    jagged = transform.resize(smooth[::s, ::s], (N, N))
    jagged[jagged>0] = 1
    props = measure.regionprops(measure.label(jagged))
    ax[i].imshow(img)
    ax[i].set_title('Solidity={}'.format(props[0].solidity))

plt.show(fig)
...