首页 > 解决方案 > regionprops 的 mean_intensity 属性根据 threshold_local 方法中指定的 block_size 返回不同的值

问题描述

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

问题是regionprops的mean_intensity属性根据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()

标签: pythonscikit-imagethreshold

解决方案


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


推荐阅读