【问题标题】:How to find most frequent pixels values of a set of RGB images, excluding black pixels?如何找到一组 RGB 图像的最常见像素值,不包括黑色像素?
【发布时间】:2020-10-19 21:31:05
【问题描述】:

我有大量来自语义分割过程的大型图像(5000,10000,3 通道,RGB)。我正在尝试为每个像素创建一个具有最“常见”值的新图像,即整个集合的每个像素的模式。这些图像有一些特殊性。首先,它们具有相同的大小,但有时包含不代表任何信息的黑色像素,必须从模式计算中排除。将所有图像集合并在一起,我将能够定义最常见的像素颜色元组 (r,g,b) 并将此信息存储为没有黑色像素的新图像。

我曾尝试使用scipy stats.mode从图像中分析np.array的列表,但是这种方法不会将(0,0,0)元组计算为nan_policy='omit',因此计算后返回黑色图像。毕竟 (0,0,0) 是最常见的像素颜色。

我也尝试用 'nan' 值替换 (0,0,0) 元组,但内存使用量上升非常快且效率不高。

谁能给我一些矢量化方法的提示来实现这个统计计算?

谢谢!

一些示例图片:img1img2img3img4

【问题讨论】:

  • 您能否更改标题以包含“RGB”和“黑色像素除外”?
  • 好的!更改以匹配条件

标签: python numpy image-processing scipy statistics


【解决方案1】:

听起来您将混合的元组和 nan 值存储在一个 numpy 数组中。这不是很有效,因为那将是一个需要为每个像素分别处理内存分配的对象数组。

最好将每个 RGB 元组转换为(整数)浮点值。单精度浮点数最多可以存储2**24-1 的整数而不会损失精度;这足以存储 24 位 RGB 值。

这是使用 5 张 50x100 像素的图像的方法。

from scipy.stats import mode as stats_mode

ny, nx = 50, 100
imgs = np.random.randint(255, size=(5, ny, nx, 3), dtype=np.uint8)
imgs[:3, ny//2, nx//2, :] = 0 # ignore thsee
imgs[3:, ny//2, nx//2, :] = [255, 255, 254] # find this

my = 10 # slice size - must divide ny
mode_img = np.zeros((ny, nx, 3), dtype=np.uint8)

flt_imgs = np.zeros((5, my, nx), dtype=np.float32)
for iy in range(0, ny, my):
    yslice = slice(iy, iy+my)

    flt_imgs[:] = imgs[:, yslice, :, 0]*(256*256)
    flt_imgs += imgs[:, yslice, :, 1]*256
    flt_imgs += imgs[:, yslice, :, 2]
    flt_imgs[flt_imgs == 0] = np.nan

    mode_result = stats_mode(flt_imgs, axis=0, nan_policy='omit')
    imode = mode_result.mode[0].astype(np.int32)
    mode_img[yslice, :, 0] = (imode >> 16) & 0xff
    mode_img[yslice, :, 1] = (imode >> 8) & 0xff
    mode_img[yslice, :, 2] = imode & 0xff
    
print(f'Found mode: {mode_img[ny//2, nx//2]}')

输出:

Found mode: [255 255 254]

【讨论】:

  • 感谢您的回答!,正如我在帖子中所说,我需要一个具有每个像素模式的新图像,所以我更改了mode_result = stats_mode(flt_imgs, nan_policy='omit') imode = mode_result.mode[0] print(imode.shape) 的代码,然后将二维数组转换为3D 将整数替换回来。 stats.mode 很慢,但它比我的方法更好地管理 RAM。再次感谢
  • 好的,我更新了答案,以提高生成模式图像而不是模式 RGB 值的内存效率。
  • 感谢更新,效果很好,但我需要 1 小时才能完成 72 4000*8000 张照片的过程。此外,加载更多照片(大约 130 张照片到 4D 阵列中)正在破坏我的 RAM(colab 25GB)。我现在正在使用一组图块,将图像集分成 8 组并运行不同的笔记本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 2020-05-17
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多