8bit画像を4bitにimquantize

6 views (last 30 days)
Naoki Ishibashi
Naoki Ishibashi on 15 Sep 2017
Answered: Naoki Ishibashi on 18 Sep 2017
添付の画像ファイル(256*256,unit8)を4bit/pixelにquantizeしたく以下のコマンドを試したのですが、画像を表示させてさい真っ白の画像になってしまいました。解決法、また間違いありましたらご指摘頂けると幸いです。
img = imread('lenna_grey');
thresh = multithresh(img);
img_quant = imquantize(img, 3);
figure, imshow(img_quant);

Accepted Answer

kenya tanaka
kenya tanaka on 16 Sep 2017
Edited: kenya tanaka on 16 Sep 2017
掲載されたプログラムでは二値化(1bit化)になっています。 このように書けば、4bit化(16値化)実現できるかと思います。
img = imread('lenna_grey');
thresh = multithresh(img,15);
img_quant = imquantize(img, thresh);
figure, imshow(img_quant);
imquantizeの返り値はdoubleです。 double型変数をimshowした場合、標準で0を黒とし1を白として表現されます。
imshow(img_quant,[1 16]);
imshowに最大値と最小値を別途与えることで、お望みの画像が得れるかと思います。
  2 Comments
kenya tanaka
kenya tanaka on 16 Sep 2017
上記投稿ですが、やってみたら真っ白でした。
対処法として、
①モノクロ画像として処理する。
img=rgb2gray(imread('wpwxunob.bmp'));
..
imshow(img_quant,[0 16]);
②img_quantを成型する。
..
img_quant=imquantize(img, thresh);
img_quant_min=min(img_quant(:));
img_quant_max=max(img_quant(:));
I=(img_quant-img_quant_min)./img_quant_max;
imshow(I);
これでお望みの画像が得れるかと思います。
Kei Otsuka
Kei Otsuka on 17 Sep 2017
Edited: Kei Otsuka on 17 Sep 2017
少し細かいですが、16を表現するためには5bit必要になってしまいますので、量子化後に1を減算してあげるとより正確ですね。 整理しますと、
画像を読み込み
img = imread('coins.png');
4bit/pixelにするために閾値を計算
thresh = multithresh(img,15);
量子化実行(-1を忘れずに)
img_quant = imquantize(img, thresh) - 1;
結果を可視化
imshow(img_quant,[])
min,max関数を使えば、最小値が0、最大値が15になっていることを確認できます。 また、この場合画像データのデータ型はdoubleですが、Fixed-Point Designerをお持ちであれば、明示的に4bit固定小数点データ型への変換が可能です。
fiimg = fi(img_quant,0,4,0)

Sign in to comment.

More Answers (1)

Naoki Ishibashi
Naoki Ishibashi on 18 Sep 2017
お二方共ご丁寧にご回答頂きありがとうございました。うまくいきました。

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!