Mean_intensity regionprops 的属性 returns 不同的值取决于在 threshold_local 方法中指定的 block_size

Mean_intensity attribute of regionprops returns different values depending on the block_size specified in the threshold_local method

我认为这只是初学者的错误,因为我使用 python 3.6.x 大约三个月,使用 scikit-image 的时间还不到那个时间。任何帮助将不胜感激。

问题是regionprops的mean_intensity属性returns根据threshold_local方法中指定的block_size取值不同,这里设置为33。

我对regionprops的理解是mean_intensity会在原始输入图像的基础上进行计算。如果是这样,那么为什么 mean_intensity 值会随着 threshold_local 计算的阈值的变化而变化。

输入是以下 uint16 灰度 .tif 图像: slice 1.tif。这是我正在使用的代码:

from skimage import io

from skimage import morphology
from skimage.filters import threshold_local
from skimage.measure import label, regionprops

from numpy import flip
from pandas import DataFrame

def start():
    while True:
        us_input = input(
            "Please enter the name of the file you'd like to analyze.\n> "
        )

        try:
            im = io.imread(us_input)
            break
        except FileNotFoundError:
            print("That file doesn't seem to exist or has been entered incorrectly.")

    detect(im)

def detect(image):
    local_thresh = threshold_local(image, 33, offset=30)
    binary_im = image > local_thresh

    label_im = label(binary_im) 
    interest_im = morphology.remove_small_objects(label_im, min_size=14.7) # ignore objects below 5um
    label_interest_im = label(interest_im)

    props(label_interest_im, image)


def props(label_interest_im, image):
    results = []
    im_props = regionprops(label_interest_im, intensity_image=image, cache=False)

    for blob in im_props:
        properties = []
        yx_coords = blob.centroid
        xy_coords = flip(yx_coords, 0)
        real_xy_coords = (xy_coords / .769230769230769) # pixel to um conversion
        round_xy_coords = real_xy_coords.round(1)
        properties.append(round_xy_coords[0])
        properties.append(round_xy_coords[1])
        properties.append(blob.mean_intensity.round(2))

        results.append(properties)

    results = DataFrame(results, columns = ['x_coord', 'y_coord', 'mean_intensity'])
    results.index = results.index + 1

    print(results)

start()

平均强度的工作原理是根据标签图像中的区域找到原始图像中的平均强度。这些区域将根据您的阈值而改变。为了清楚地理解,我建议,对于每个 threshold_local window 大小,查看生成的标记对象。 (你可以使用skimage.color.label2rgb。)你会看到它们是不同的,所以它们给出不同的平均强度值也就不足为奇了。