簡體   English   中英

如何找到一組 RGB 圖像的最常見像素值,不包括黑色像素?

[英]How to find most frequent pixels values of a set of RGB images, excluding black pixels?

我有大量來自語義分割過程的大型圖像(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)元組,但 ram 使用率上升得非常快並且效率不高。

誰能給我一些矢量化方法的提示來實現這個統計計算?

謝謝!

一些示例圖像: img1 img2 img3 img4

聽起來您將混合元組和 nan 值存儲在 numpy 數組中。 這不是很有效,因為那將是一個 object 數組,需要為每個像素分別處理 memory 分配。

最好將每個 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]}')

Output:

Found mode: [255 255 254]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM