2013-01-21 20 views
5

私はむしろmatlabの新機能ですが、私は誰かがこの質問を手伝うことを望んでいました。だから、私はグレースケールに変換し、次にグレーレベルの数を減らしたいカラー画像を持っています。だから私は画像を読んで、私はグレースケールに画像を変換するためにrgb2gray()を使いました。しかし、私は255階調の代わりに32階調のみを使用するように画像を変換する方法がわかりません。matlabのグレースケール画像のグレーレベル数を変更しました

私はカラーマップ(gray(32))を使用しようとしていましたが、これはプロットされた画像自体や画像の下のカラーバーには影響しませんでした。だから私はどこを見るべきか分からなかった。そこに任意のヒント?ありがとう。

+0

実際には、8色の間隔でレベルを選択するだけで、それ以上量子化したくない場合があります。改善されたグレースケール量子化方法の使用を検討してください。 – mmgp

答えて

0

あなたの画像データのタイプが、私が疑うと思われるuint8であるかどうか確認してください。その場合、整数除算の床効果を悪用するために画像を8で除算し、再び8を掛けると、I2=(I/8)*8が設定されます。 I2は、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とそれぞれの量子化、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

これは病理学的な例ではありません。

関連する問題