MATLAB Answers

imwiteで使って​書き出した際に、小数​点以下を切り上げない​。

16 views (last 30 days)
yunosuke ide
yunosuke ide on 23 Jan 2020
Answered: yunosuke ide on 23 Jan 2020
255でスケーリングしたデータをimwriteで書き出したのですが、
再度255でスケーリングされる際に小数点以下が自動的に全て四捨五入されてしまいます。
これを防ぎ、データを小数で書き出す方法はありますか?
よろしくお願い致します。

  2 Comments

michio
michio on 23 Jan 2020
現象を確認するコード、できればお願いいたします。
MATLAB に入っているサンプル画像としては以下のようなものがあります:
a = imread('peppers.png')
A = imread('ngc6543a.jpg');
[X,cmap] = imread('corn.tif');
yunosuke ide
yunosuke ide on 23 Jan 2020
michioさん、コメントありがとうございます。
書き出したい行列Sは、要素が小数点第4位まである(175.5678など)、1152×1920の行列です。
A = repmat(255,1152,1920);
S = S./A;
imwrite(S ,' S.bmp ')
この方法で書き出すと、上の例ですと、要素の値が176になってしまいます。
これを小数のまま書き出す方法はありませんでしょうか??

Sign in to comment.

Accepted Answer

michio
michio on 23 Jan 2020
Edited: michio on 23 Jan 2020
同じ現象をこちらで確認できない(確認できるコードがあれば・・)ので、改めて確認させてください。すいません。
以下、imwrite 関数のページからの引用です
  • A uint8 データ型の場合、imwrite は 8 ビット値を出力します。
  • A uint16 データ型で、出力ファイル形式が 16 ビット データ (JPEG、PNG および TIFF) をサポートしている場合、imwrite は 16 ビット値を出力します。出力ファイル形式が 16 ビット データをサポートしていない場合、imwrite はエラーを返します。
  • A double または single データ型のグレースケールまたは RGB カラー イメージの場合、imwrite は、ダイナミック レンジを [0,1] と仮定してデータを自動的に 255 でスケールしてから、8 ビット値としてファイルに書き込みます。A のデータが single の場合は、GIF または TIFF ファイルに書き込む前に、A double に変換します。
  • A logical データ型の場合、imwrite はデータをバイナリ イメージと仮定し、その形式で許可されている場合は、ビット深度 1 でファイルに書き込みます。BMP、PNG、または TIFF 形式は、入力配列としてバイナリ イメージを受け入れます。
恐らく書き出したいデータは double 型かと想像していますが、その場合 1 以上のデータはすべて 255 の uint8 型として保存され、0 から 1 の間のデータも 0-255 の整数として保存されます。
a = rand(3)*200; % 0 - 200 の間の乱数を作ってみます。あくまで例として。
imwrite(a,'test.bmp')
imread('test.bmp')
ans =
3×3 uint8 行列
255 255 255
255 255 255
255 255 255
要は
> 再度255でスケーリングされる際に小数点以下が自動的に全て四捨五入されてしま
っているという結果になっているが、整数ではなく小数点も丸めずに保存されたいということでしょうか?
unit8 である以上この現象は避けられませんが、unit16 型であれば 255 に再度スケールすれば小数点情報は多少維持できる・・とは思います。あくまで数値上はですが、いかがでしょう。
> Auint16 データ型で、出力ファイル形式が 16 ビット データ (JPEG、PNG および TIFF) をサポートしている場合、imwrite は 16 ビット値を出力します。

  0 Comments

Sign in to comment.

More Answers (1)

yunosuke ide
yunosuke ide on 23 Jan 2020
ご丁寧な回答ありがとうございます。
unit8 で小数点を丸めずに保存したかったのですが、この現象は避けられないのですね。。。
他の方法を探してみます、ありがとうございました。(m_m)

  0 Comments

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!