我从语义分割过程中也获得了大量大型图像(5000、10000、3通道,RGB)。我正在尝试为每个像素(完整集的每个像素的模式)创建具有最大“公共”值的新图像。这些图像有一些特殊性。首先,它们具有相同的大小,但是有时包含黑色像素,这些黑色像素表示任何信息,因此必须从模式计算中排除。合并所有图像集,我将能够定义最常见的像素颜色元组(r,g,b),并将此信息存储为没有黑色像素的新图像。
我尝试过使用scipy stats.mode
分析np.array
图像列表,但是此方法未将(0,0,0)
元组计为nan_policy='omit'
,因此计算后返回黑色图像。毕竟,(0,0,0)是最频繁的像素颜色。
我也尝试用(0,0,0)
一个'nan'
值替换元组,但是ram的使用速度非常快并且效率不高。
谁能给我一些实现该统计数据的矢量化方法的提示?
谢谢!
听起来您将混合的元组和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]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句