6

私はmatlabにかなり慣れていませんが、誰かがこの質問を手伝ってくれることを望んでいました。だから私はグレースケールに変換してからグレーレベルの数を減らしたいカラー画像を持っています。そこで、画像を読み込み、rgb2gray()を使用して画像をグレースケールに変換しました。ただし、255グレーレベルではなく32グレーレベルのみを使用するように画像を変換する方法がわかりません。

colormap(gray(32))を使おうとしましたが、プロットされた画像自体や画像の下のカラーバーには影響がないようです。だから私は他にどこを見ればいいのかわからなかった。そこに何かヒントはありますか?ありがとう。

4

3 に答える 3

3

範囲 [0, 255] のグレースケール イメージをresult = (img/8)*8その範囲のサブセットに変換しますが、現在は 32 の値のみを使用しているため、望ましくないアーティファクトが生じる可能性があります。視覚的に優れた画像を生成する可能性のある方法は、Improved Grayscale Quantization (略して 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上記の方法を使用したそれぞれの量子化について考えてみましょう。

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

同じ画像ですが、次のようにして量子化され(img/(256/(2^bits)))*(256/(2^bits))ます。

ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力 ここに画像の説明を入力

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

于 2013-01-21T17:41:40.080 に答える
2

単純な丸めによって、画像内の異なる値の数を減らすことができます。

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

imhist(I)効果については、 とを参照してくださいimhist(J)

ただし、画像サイズを小さくしたい場合は、Photoshop、Gimp、IrfanView などの画像処理プログラムを使用して、32 色の gif として保存することをお勧めします。そうすれば、実際にファイルのパレットを減らすことができます。これは、Matlab ではできないことだと思います。

于 2013-01-21T08:46:13.757 に答える
0

画像データのタイプuint8が疑わしいものかどうかを確認してください。その場合は、画像を 8 で割って整数除算の床効果を悪用し、もう一度 8 を掛けると、次のようになりますI2=(I/8)*8I232 のグレー レベルしかありません。

于 2013-01-21T08:45:55.213 に答える