uint16からint16ヘ変換
Show older comments
以下のコードにてdicom画像をuint16からint16に変換をするのですが、uint16で値が0 のセルがint16に変換すると-32768になります。値が0のままではなくこの値になるのはなぜですか?
a=dicomread 'a.dcm'
im2int16(a)
3 Comments
Atsushi Ueno
on 30 Oct 2022
Moved: Atsushi Ueno
on 31 Oct 2022
>uint16で値が0 のセルがint16に変換すると-32768になります。値が0のままではなくこの値になるのはなぜですか?
⇒逆質問:具体的なプログラムを想像出来ていないのですが、下記の様な形で「インデックス付きイメージ」を使用していますか?YESなら、オフセット変換により1減算されたデータの型を変換する際に質問の様な現象が起こり得ると思った次第です。
[X,cmap] = dicomread(___)
Atsushi Ueno
on 30 Oct 2022
Edited: Atsushi Ueno
on 31 Oct 2022
おそらくuint16型でもint16型でもdicom画像としては正しく表示されているのだと想定します。
画像変換の場合、値を維持する型変換(cast関数相当)ではなく、ビット配列を維持する型変換(typecast関数相当)が実行されるはずです。後者でuint16型の最大値である65535をint16型に変換すると-1になります。
cast(uint16(65535),'int16') % 値を保持しようとする為、65535はint16型で表現出来る最大値32767に飽和する
typecast(uint16(65535),'int16') % ビット配列を保持する為、65535(0xFFFF)をint16に変換すると-1(0xFFFF)になる
- uint16型: 0 ⇒ 1 ⇒ 2 ⇒ 32767 ⇒ 32768 ⇒ 32769 ⇒ 65534 ⇒ 65535 ⇒ 0 ⇒ 1 ⇒ 2
- int16型: 0 ⇒ 1 ⇒ 2 ⇒ 32767 ⇒ -32768 ⇒ -32767 ⇒ -2 ⇒ -1 ⇒ 0 ⇒ 1 ⇒ 2
(2022/10/31追記) 上記の解釈は誤りでした。輝度を表す値をuint16型からint16型に変換する場合、値域の半分(-32768)だけオフセットさせないと輝度の対応がズレてしまうんですね。
RYO ARATA
on 31 Oct 2022
Moved: Atsushi Ueno
on 31 Oct 2022
Accepted Answer
More Answers (0)
Categories
Find more on Convert Image Type 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!