画像に一つ目の関心領​域を設定後に位置や大​きさを微調整し,次に​別の関心領域設定に移​りたい場合について

画像に複数の関心領域を設定するとき,一つ目の関心領域の位置や大きさの微調整が終了したのち,次の関心領域の設定に移りたい場合には
wait関数が使用できると考えましたが,以下のようなコードではROI_2に移ることなく次に進むことができません.
I = imread('pout.tif');
imshow(I)
ROI_1 = drawpolygon(); % drawcircle(),drawfreehand()
wait(ROI_1)
bw_1 = ROI_1.createMask();
ROI_2 = drawpolygon(); % drawcircle(),drawfreehand()
wait(ROI_2)
bw_2 = ROI_2.createMask();
wait関数やROI_2に移る方法についてご教示頂けないでしょうか.
(追記,編集分)
また,データ型がuint16である画像をマスク画像とオーバーレイする場合,
Overlay_1 = labeloverlay(uint8(I),bw_1); ...(1)
imshow(Overlay_1)
にてうまくいくのですが,
以下に添付しましたコントラストをもつ画像を前述と同様に処理しても,真っ白な画像にマスク画像がオーバーレイされて出力されます.
ご教示頂いた方法で,
Overlay_2 = labeloverlay(uint16(I)*20,bw_2); ...(2)
imshow(Overlay_2)
といくらかの係数をかけるとうまく表示されました.
labeloverlayにて出力される融合画像はuint8と記載あるため,あらかじめ画像データをuint8にキャストしたのが(1)のコードです.当然ながら,(1)をuint16とすると画像は真っ黒に表示されます.逆に,以下の添付した画像ではuint8にすると,真っ白な画像(すべての画素がなぜか255)となり,uint16にすると真っ黒な画像が表示されます.
同じ画像表示にも関わらず非常に煩雑なのですが,キャスト変換や画像表示の考え方が間違っているのでしょうか.ご教示頂けないでしょうか.

 Akzeptierte Antwort

Atsushi Ueno
Atsushi Ueno am 1 Mai 2023

0 Stimmen

使った事が無く明確なイメージを持っていませんが:
  • drawpolygon 関数は新たに多角形ROIを作成完了するまで(※)ブロック
  • waitメソッドは既存のROIを変更完了するまで(※)ブロック
  •  (※いずれもマウス ボタンのダブルクリックにより作業完了と判断される)
なので、一つの多角形ROIを作成完了(ダブルクリック)後、そのROIをもう一度ダブルクリックすれば、新たにもう一つの多角形ROIを作成出来るのではないでしょうか?

5 Kommentare

KT
KT am 1 Mai 2023
ご回答ありがとうございます.
クリックする場所に依存しないと思っていたので,ROI上でダブルクリックすると次に進むことができました.
また,続きで書こうとしていたのですが,上記のマスクと画像をオーバーレイするつもりで,
Overlay_1 = labeloverlay(uint8(I),bw_1); % 出力はuint8
imshow(Overlay_1)
はうまくいくのですが,
以下の添付に示しますコントラストをもつ画像を前述と同様に処理しても,真っ白な画像にマスク画像がオーバーレイされて出力されます.
添付のようにimagescでは表示されるのですが,マスク画像とのオーバーレイが解決できずにいます.
Atsushi Ueno
Atsushi Ueno am 1 Mai 2023
コントラスト値から察するに、表示されない画像のデータ型はuint16かint16だと思います。画像データの値を10倍位すれば、画像として見える様になると思います。
labeloverlay 関数のサンプルプログラムで同様の事象を試してみました。
下記の画像データAはuint8型ですが、これをuint16型にキャストすると同様に元の画像が暗過ぎて見えない状態になってしまいました。
A = imread('kobi.png'); % 画像データAはuint8型
[L,N] = superpixels(A,20);
B = labeloverlay(uint16(A),L); % 画像データAをuint16型にキャストする
imshow(B) % Aの値域が0-65535に変わったのに値は0-255のままなので、暗すぎて見えない
データ型をuint8⇒uint16にキャストしたので、データの値も値域の拡大に合わせ256倍すると、uint8型の時と同様に表示される様になりました。
B = labeloverlay(uint16(A)*256,L);
imshow(B)
KT
KT am 2 Mai 2023
*20程度でうまく表示できました.
同じデータ型uint16にも関わらず,
Overlay_1 = labeloverlay(uint8(I),bw_1);
Overlay_1 = labeloverlay(uint16(I)*[係数],bw_1);
にしなければならないのが非常に煩雑です.
labeloverlayにて出力される融合画像はuint8と記載あるため,あらかじめuint16画像データをuint8にキャスト変換する考えだったのですが,添付した画像ではuint8にすると,すべての画素が255となりキャスト変換もうまくいっていないように思います.
キャスト変換や画像表示の考え方が間違っているのでしょうか.
Atsushi Ueno
Atsushi Ueno am 2 Mai 2023
> キャスト変換や画像表示の考え方が間違っているのでしょうか
いいえ。間違っていないと思います。
A = imread('kobi.png'); % 画像データAはuint8型
[L,N] = superpixels(A,20);
B = labeloverlay(im2double(A),L); % 表示色を維持する様に値を自動スケーリングしてくれる
C = labeloverlay(im2int16(A),L); % 同様
D = labeloverlay(im2single(A),L); % 同様
E = labeloverlay(im2uint16(A),L); % 同様
F = labeloverlay(im2uint8(A),L); % 同様
montage({B,C,D,E,F}); % 上記いずれの型を入力してもlabeloverlay関数の出力はuint8
> 真っ白な画像にマスク画像がオーバーレイされて出力されます
⇒ 先日のコメントは下記の様に間違ってたかな(※)と思っていましたが、上手くいきましたか。2000前後の20=40000前後で表示されたという事はやはり値域 0~65535 の uint16 画像を入力していたのだと思いますが、labeloverlay 関数の出力は真っ白ではなくほぼ真っ黒になるはずなのです。まぁいいや
(※)【誤】画像データ型はuint16かint16で、値域0~65535に対し2000前後だからほぼ黒になる
(※)【正】画像データ型はsingleかdoubleで、値域0.0~1.0に対し2000前後だから真っ白になる
KT
KT am 2 Mai 2023
im2...にて自動スケーリングしてくれれば良かったのですが,同じように真っ白な画像が出力されました.0-1のマスク画像と0-65535をもつ画像(添付したような画像)では微調整がもっとも良さそうです.
オーバーレイされた背景画像のコントラストを自由に変更できればいいのですが,ご教示頂いた係数をかけて調整するのが一番納得いきました.
最後のコメントの訂正も非常に分かりやすい回答ありがとうございました.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Produkte

Version

R2021a

Gefragt:

KT
am 1 Mai 2023

Kommentiert:

KT
am 2 Mai 2023

Community Treasure Hunt

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

Start Hunting!