8bit画像を4bitにimquantize

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

Risposta accettata

kenya tanaka
kenya tanaka il 16 Set 2017
Modificato: kenya tanaka il 16 Set 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 Commenti
kenya tanaka
kenya tanaka il 16 Set 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 il 17 Set 2017
Modificato: Kei Otsuka il 17 Set 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)

Accedi per commentare.

Più risposte (1)

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

Community Treasure Hunt

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

Start Hunting!