MATLAB Answers

subtract関数の処理について

25 views (last 30 days)
啓史 千葉
啓史 千葉 on 19 Jan 2021
Commented: Shunichi Kusano on 21 Jan 2021
subtractという関数を使い、画像同士の減算を行っています。
私が行っている処理は、画像から取り出したい信号だけが見えるように、信号のある画像から信号のない画像を減算することで処理を行っています。
その際に使っているsubtract関数の処理についてお聞きしたいのですが、この関数は減算をしたあとの限界値?はどのようになっているのでしょうか?
例えば、8bitの画像同士を引き算するとき、強度の最大値が256になると思うのですが、差し引かれる画像より差し引く画像の強度値が大きい場合はどのようになりますか?
128-256=-128とならず、0になりますか?
また、-128となるような処理の仕方を知っている方がいましたら教えて頂けると助かります。
減算後のマイナス値を二乗してSN比の高い画像を得られれば良いなと考えております。
とても困っています。よろしくお願いします。

Answers (1)

Shunichi Kusano
Shunichi Kusano on 20 Jan 2021
imsubtract関数のことでしょうか?それともsubtractという自前の関数をお使いなのでしょうか。
imsubtract関数であれば負の数はゼロに丸められると記載があります。
負の数を出したいのでしたらsingleかdoubleに変換してから計算するのが一番間違いないかと思います。もし元の画像がuint8に固定の場合でしたら計算結果の取りうる範囲は-255~255となるのでint16型でも大丈夫です。
a = rand(3,3)*100;
b = rand(3,3)*100;
imsubtract(a,b)% マイナスが出るのを確認
class(a) % a(bも同じ)の型を確認
  2 Comments
Shunichi Kusano
Shunichi Kusano on 21 Jan 2021
書かれている通り、負の値をそのまま画像として保存はできませんので、int16を画像として保存することはできないです。
また、私が言い出したことなのに恐縮ですが、int16のままだと2乗に耐えられないことになります(理屈上2乗で出てくる最大値、最小値とint16で表現可能な最大値最小値を見比べると確認できます)。doubleに変換したうえで規格化まで行い、画像として保存する段階でuint8に戻す、というのが一番楽だと思います。
規格化も、最大値を基準にするとデータによって基準が変わることになるので、本当にそれでいいのかの検討は必要かと思います。
あと、蛇足かもしれませんが、uint8の最大値は255ですね。表現できるパターンは2^8=256こあるのですが、それを0から割当てていくので最大は255で打ち止め、ということになります。

Sign in to comment.

Tags

Community Treasure Hunt

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

Start Hunting!