根据存储在不同 ndarray 中的组在 ndarray 中找到 R、G、B 的最大值
Find the maximum of R,G,B in a ndarray according to their group stored in a different ndarray
我目前正在使用包 skimage.segmentation
.
进行图像超像素 SLIC 分割
我的原图是3042*4032
(12Mpx)。在 skimage
中,数组的形状是 (3042,4023,3)
。分割后,我在 3042*4032
数组中表示了大约 3000 个超像素。
我的目标是为每个超像素找到在红色通道、蓝色通道和绿色通道上具有最大值的像素的比例。
我已经有一个函数可以给我整个图像中最大值的索引:
def proportion_majoritaire_rgb_image(img):
""" In a pixel, which channel [R,G,B] has the maximum value ?
:param img: image (N,m) skimage rgb
:return: (N,m) array with indexes [0,1,2]
"""
return np.argmax(img, axis=2)
并且通过过滤单个标签上的图像,我可以得到单个标签中最大RGB的比例:
def proportion_majoritaire_rgb_label(img, matrice_label):
"""
:param img: image (N,m) skimage rgb
:param matrice_label: ndarray (N,m) labels SLIC
:return: (K, 3) array of K labels and 3 proportions
"""
indice_max_rgb = proportion_majoritaire_rgb_image(img)
n_pixel_max_rgb = []
for k in np.unique(image_grains_ble_slic).flat:
label_data = indice_max_rgb[matrice_label == k]
n_pixel_max_rgb.append(np.unique(label_data, return_counts=True)[1] / np.shape(label_data)[0])
return n_pixel_max_rgb
问题是如何在没有这个 for 循环的情况下获取我所有 3000 个标签的信息?计算时间太长,有没有其他办法?
最终输出应该是一个带有 K 个标签的 ndarray (K,3) 并且对于每个通道 RGB 具有最大值的像素的比例。
提前致谢!
编辑:使用 np.unique(image_grains_ble_slic).flat
作为循环的迭代器似乎更快,但我避免 for 循环的目标仍然成立
由于long-standing feature request for skimage.measure.regionprops
to allow measuring multichannel images. But, we can hack it together with some repeated calls to regionprops_table
,它给了我们向量化的输出,所以有点老套:
from skimage import measure
index_max_rgb = np.argmax(image, axis=2)
max_index_images = [
(index_max_rgb == i).astype(float) for i in range(3)
]
proportions_per_channel = [
measure.regionprops_table(
image_grains_ble_slic,
intensity_image=intensity,
properties=('mean_intensity',),
)['mean_intensity']
for intensity in max_index_images
]
proportions = np.stack(proportions, axis=1)
顺便说一句,请务必将 start_label=1
与 SLIC 一起使用,因为 regionprops 会忽略属于背景的 0 标签。
我目前正在使用包 skimage.segmentation
.
我的原图是3042*4032
(12Mpx)。在 skimage
中,数组的形状是 (3042,4023,3)
。分割后,我在 3042*4032
数组中表示了大约 3000 个超像素。
我的目标是为每个超像素找到在红色通道、蓝色通道和绿色通道上具有最大值的像素的比例。
我已经有一个函数可以给我整个图像中最大值的索引:
def proportion_majoritaire_rgb_image(img):
""" In a pixel, which channel [R,G,B] has the maximum value ?
:param img: image (N,m) skimage rgb
:return: (N,m) array with indexes [0,1,2]
"""
return np.argmax(img, axis=2)
并且通过过滤单个标签上的图像,我可以得到单个标签中最大RGB的比例:
def proportion_majoritaire_rgb_label(img, matrice_label):
"""
:param img: image (N,m) skimage rgb
:param matrice_label: ndarray (N,m) labels SLIC
:return: (K, 3) array of K labels and 3 proportions
"""
indice_max_rgb = proportion_majoritaire_rgb_image(img)
n_pixel_max_rgb = []
for k in np.unique(image_grains_ble_slic).flat:
label_data = indice_max_rgb[matrice_label == k]
n_pixel_max_rgb.append(np.unique(label_data, return_counts=True)[1] / np.shape(label_data)[0])
return n_pixel_max_rgb
问题是如何在没有这个 for 循环的情况下获取我所有 3000 个标签的信息?计算时间太长,有没有其他办法?
最终输出应该是一个带有 K 个标签的 ndarray (K,3) 并且对于每个通道 RGB 具有最大值的像素的比例。
提前致谢!
编辑:使用 np.unique(image_grains_ble_slic).flat
作为循环的迭代器似乎更快,但我避免 for 循环的目标仍然成立
由于long-standing feature request for skimage.measure.regionprops
to allow measuring multichannel images. But, we can hack it together with some repeated calls to regionprops_table
,它给了我们向量化的输出,所以有点老套:
from skimage import measure
index_max_rgb = np.argmax(image, axis=2)
max_index_images = [
(index_max_rgb == i).astype(float) for i in range(3)
]
proportions_per_channel = [
measure.regionprops_table(
image_grains_ble_slic,
intensity_image=intensity,
properties=('mean_intensity',),
)['mean_intensity']
for intensity in max_index_images
]
proportions = np.stack(proportions, axis=1)
顺便说一句,请务必将 start_label=1
与 SLIC 一起使用,因为 regionprops 会忽略属于背景的 0 标签。