2013-01-21 173 views
5

我對matlab很新,但我希望有人能夠幫助解決這個問題。所以我有一個彩色圖像,我想要轉換爲灰度,然後減少灰度級數。所以我在圖像中閱讀,並使用rgb2gray()將圖像轉換爲灰度。但是,我不確定如何將圖像轉換爲僅使用32灰度級而不是255灰度級。更改matlab中灰度圖像中灰度級的數量

我試圖使用colormap(灰色(32)),但這似乎對繪圖圖像本身或圖像下的顏色條沒有影響。所以我不知道還有什麼可以看的。有任何提示嗎?謝謝。

+0

你真的不想通過簡單地選擇8種顏色的間隔進行量化。考慮使用改進的灰度量化方法。 – mmgp

回答

0

檢查您的圖像數據的類型是否是我懷疑的uint8。如果是這種情況,將圖像分成8份以濫用整數除法的地板效果,再乘以8,然後設置爲:I2=(I/8)*8I2將只有32個灰度級。

2

可以通過簡單的舍入減少不同值的數量的圖像中:

I = rgb2gray(imread('image.gif')); 
J = 8*round(I/8) 

的效果見imhist(I)imhist(J)

但是,如果您想縮小圖像大小,最好使用Photoshop,Gimp或IrfanView等圖像處理程序,並保存爲32色gif。通過這種方式,你實際上會減少文件的調色板,我認爲這是Matlab無法做到的。

+2

小心使用'round'。如果'I'不是整數類型,則最終將有33個灰度級。如果'I'是整型,則不需要任何'round'。 ;-) –

+0

@ s.bandara:關於四捨五入的好處。此外,看起來OP可能實際上是在尋找'imwrite',使用適當的地圖,但我現在沒有時間弄清楚。 – Junuxx

+0

@Junuxx你是否意識到由此產生的圖像可能看起來有多糟? (我在回答這個問題時只是因爲它出現在頂部,當我訪問這個問題時,這一點同樣有效) – mmgp

2

雖然result = (img/8)*8會將[0,255]範圍內的灰度圖像轉換爲該範圍的子集,但現在只使用32個值,但可能會產生不希望的人爲現象。一種可能產生視覺上更好的圖像的方法稱爲改進的灰度量化(縮寫爲IGS)。用於執行它的僞代碼可被給定爲:

mult = 256/(2^bits) 
mask = 2^(8 - bits) - 1 
prev_sum = 0 
for x = 1 to width 
    for y = 1 to height 
     value = img[x, y] 
     if value >> bits != mask: 
      prev_sum = value + (prev_sum & mask) 
     else: 
      prev_sum = value 
     res[x, y] = (prev_sum >> (8 - bits)) * mult 

作爲一個例子,考慮下面的圖中,並與bits = 5相應quantizations,bits = 4,和bits = 3使用上述方法:

enter image description hereenter image description hereenter image description hereenter image description here

現在同樣的圖像,但量化做(img/(256/(2^bits)))*(256/(2^bits))

enter image description hereenter image description hereenter image description hereenter image description here

這不是一個病理例子。