获取每个超像素的 RGB 像素值列表

Posted

技术标签:

【中文标题】获取每个超像素的 RGB 像素值列表【英文标题】:Get the list of RGB pixel values of each superpixel 【发布时间】:2018-02-20 12:51:03 【问题描述】:

我有一个尺寸为 (224,224,3) 的 RGB 图像。 l 使用SLIC算法对其进行超像素分割。

如下:

img= skimageIO.imread("first_image.jpeg")
print('img shape', img.shape) # (224,224,3)
segments_slic = slic(img, n_segments=1000, compactness=0.01, sigma=1) # Up to 1000 segments
segments_slic.shape
(224,224)

返回的段数为:

np.max(segments_slic)
Out[49]: 595

从 0 到 595。所以,我们有 596 个超像素(区域)。

我们来看看segments_slic[0]

segments_slic[0]
Out[51]: 
array([ 0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,
        3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  5,  5,  5,  5,  5,
        5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,
        8,  8,  8,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9,  9,
       10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12,
       12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
       14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16,
       16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18,
       18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20,
       20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
       21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23,
       23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25,
       25, 25, 25])

我想得到什么?

为每个超像素区域制作两个数组,如下所示:

1) 数组:包含属于同一超像素的像素的索引。

例如

superpixel_list[0] 包含属于超像素 0 的像素的所有索引。

superpixel_list[400]包含属于超像素400的像素的所有索引

2)superpixel_pixel_values[0] : 包含属于 superpixel 0 的像素的像素值(在 RGB 中)。

例如,假设像素 0、24、29、53 属于超像素 0。那么我们得到

superpixel[0]= [[223,118,33],[245,222,198],[98,17,255],[255,255,0]]# RGB values of pixels belonging to superpixel 0

什么是有效/优化的方式来做到这一点? (因为我有 l 个图像数据集要循环)

EDIT-1

def sp_idx(s, index = True):
     u = np.unique(s)
         if index:
     return [np.where(s == i) for i in u]
         else:
     return [s[s == i] for i in u]
     #return [s[np.where(s == i)] for i in u] gives the same but is slower
superpixel_list = sp_idx(segments_slic)
superpixel      = sp_idx(segments_slic, index = False)

superpixel_list 中,我们应该得到一个包含属于同一超像素的像素索引的列表。 例如 superpixel_list[0] 应该得到受影响像素的所有像素索引到超像素0

但是我得到以下信息:

superpixel_list[0]
Out[73]: 
(array([ 0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,
         3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  5,  5,  5,
         5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,
         7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9, 10,
        10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13]),
 array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
        6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6,
        7, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 0, 1,
        2, 3, 4, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2]))

为什么是两个数组?

例如,在 superpixel[0] 中,我们应该得到影响到超像素 0 的每个像素的 RGB 像素值,如下所示: 例如像素 0, 24, 29, 53 会影响到超像素 0 :

superpixel[0]= [[223,118,33],[245,222,198],[98,17,255],[255,255,0]]

但是,当我使用您的功能时,我会得到以下信息:

superpixel[0]
Out[79]: 
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

感谢您的帮助

【问题讨论】:

这是 regionprops 旨在计算的内容。见skimage.measure.regionprops 【参考方案1】:

可以使用np.where 和生成的索引来完成。

def sp_idx(s, index = True):
     u = np.unique(s)
     return [np.where(s == i) for i in u]

superpixel_list = sp_idx(segments_slic)
superpixel      = [img[idx] for idx in superpixel_list]

【讨论】:

为什么我们为每个 superpixel_list 得到两个数组? 因为每个像素都有两个索引,因为数组是二维的。 np.where 的输出格式可以直接索引原始数组(如s[idx]),而类似np.c_[np.where(s == i)].T(看起来更好)的东西没有那么实用。 我认为这是有道理的。你的意思是,它代表每个像素的 (x,y) 坐标。第一个数组表示 x 坐标,第二个数组表示 y 坐标?你确认了吗! 。 . .是的?尝试查找np.where的文档

以上是关于获取每个超像素的 RGB 像素值列表的主要内容,如果未能解决你的问题,请参考以下文章

SLIC超像素(superpixel)算法

如何获取PNG图片某点像素的rgba值

从 bmp 文件中读取 RGB 像素

如何获取超像素分割后的每个小块

在鼠标移动时获取fabric.js中图像像素的rgb值

如何通过鼠标单击获取像素的 rgb 颜色值