uint16からint16ヘ変換
30 views (last 30 days)
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
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)だけオフセットさせないと輝度の対応がズレてしまうんですね。
Accepted Answer
Atsushi Ueno
on 31 Oct 2022
画像変換の場合、値を維持する型変換(cast関数相当)でも、ビット配列を維持する型変換(typecast関数相当)でも期待通りの変換が出来ません。例えばuint16型で最も暗い黒は値が0の時であるのに対し、int16型の0は灰色(中間の輝度)になるので、-32768だけオフセットしないと望みの変換にならないんですね。当該変換を実現するのがim2int16関数なんですね。
- uint16型:(輝度暗い) 0 ⇒ 1 ⇒ 32767 ⇒ 32768 ⇒ 32769 ⇒ 65534 ⇒ 65535 (輝度明るい)
- int16型:(輝度暗い) -32768 ⇒ -32767 ⇒ -1 ⇒ 0 ⇒ 1 ⇒ 32766 ⇒ 32767 (輝度明るい)
0 Comments
More Answers (0)
See Also
Categories
Find more on DICOM Format 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!