imwiteで使って書き出した際に、小数点以下を切り上げない。
4 views (last 30 days)
Show older comments
255でスケーリングしたデータをimwriteで書き出したのですが、
再度255でスケーリングされる際に小数点以下が自動的に全て四捨五入されてしまいます。
これを防ぎ、データを小数で書き出す方法はありますか?
よろしくお願い致します。
2 Comments
michio
on 23 Jan 2020
現象を確認するコード、できればお願いいたします。
MATLAB に入っているサンプル画像としては以下のようなものがあります:
a = imread('peppers.png')
A = imread('ngc6543a.jpg');
[X,cmap] = imread('corn.tif');
Accepted Answer
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 に再度スケールすれば小数点情報は多少維持できる・・とは思います。あくまで数値上はですが、いかがでしょう。
> A が uint16 データ型で、出力ファイル形式が 16 ビット データ (JPEG、PNG および TIFF) をサポートしている場合、imwrite は 16 ビット値を出力します。
0 Comments
More Answers (1)
See Also
Categories
Find more on Image Processing Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!