1

我有一个代码,在某些时候我得到一组二维二进制 numpy 数组来表示主要是椭圆和圆的对象(细胞核)

我需要一个关于边缘有多粗糙(锯齿状)的度量。病理学文献中有核轮廓指数:周长/ sqrt(面积)这是有效的,但在我们的例子中,我们特别需要看看周长有多“粗糙”。椭圆和圆形的核轮廓指数是不同的,即使它们都有光滑的边缘。在我们的例子中,一个带有粗糙边缘的圆比一个带有光滑边缘的椭圆更重要

我考虑过使用此处解释的凸包:我认为在这种情况下,对于许多小凹度(这对我们来说是重要的情况)和一个主要的凹度(这不是那么重要)来说,度量是否相同,就像图片中一样以下。在此处输入图像描述

我也尝试过openCV,但是我发现很难从数学上理解那里实际发生的事情,它看起来非常像skimage凸面外壳,我更愿意坚持使用skimage

4

1 回答 1

3

我认为可靠性(即对象中的像素与凸包像素的比率)可能是开始测试的一个很好的指标。它可以通过函数以直接的方式计算skimage.measure.regionprops。我使用这种方法获得的结果如下所示:

坚固性

如果该指标不适合您的应用程序,您可以尝试compactness of circular variance在这里查看形态特征的综合汇编。

这是我用来生成上面的玩具示例的代码:

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)
于 2019-02-10T00:46:51.957 回答