フィルターのクリア

Remove points in a 3D matrix that lie inside a 2D polygon on each layer

1 回表示 (過去 30 日間)
Cameron
Cameron 2024 年 1 月 31 日
コメント済み: Cameron 2024 年 2 月 2 日
I'm visualizing an MRI but am trying to remove a lot of artifacts that usually come in these images. I've implemented two solutions:
  1. use knnsearch to remove points too far away from their neighbors (i.e. floating out in the middle of nowhere) - works very well
  2. Have a user draw a polygon around remaining points from a topdown view (view 2) to remove the clusters of bad points from each layer.
The issue I'm running into is this: I can have a user create a polygon and get the points of the polygon with something like roi.Position, however I'm having trouble figuring out how to efficiently come through each Z layer of the matrix to remove the points within the polygon. Any ideas?
plot3(target_cluster(:,1,:),target_cluster(:,2,:))
roi = drawpolygon('Color','r');
My instinct is to run a for loop through each layer, but this seems inefficient. TIA
  2 件のコメント
Matt J
Matt J 2024 年 1 月 31 日
編集済み: Matt J 2024 年 1 月 31 日
If the process is going to have an interactive step in each slice, why are you fretting that it be fast?
Cameron
Cameron 2024 年 2 月 1 日
編集済み: Cameron 2024 年 2 月 2 日
It won't be interactive per slice, I'm having the user draw a polygon from a top down view and effectively eliminate a vertical column group from the mri by adjusting the values of all points within that same polygon to 0 on every slice.

サインインしてコメントする。

採用された回答

Matt J
Matt J 2024 年 2 月 1 日
and effectively eliminate a column from the mri by adjusting the values of all points within that same polygon to 0 on every slice.
If so, then once you've drawn the ROI, it would just be,
mriVolume=mriVolume.*(~roi.createMask);
  3 件のコメント
Matt J
Matt J 2024 年 2 月 2 日
編集済み: Matt J 2024 年 2 月 2 日
Is this not what you want? You have an MRI image volume and you want to zero all pixels inside a polygon and repeat that for the same set of pixels in each slice. As you can see below, the result my answer gives is not 2D.
mriVolume=rand(3,3,3) %Fake mri volume
mriVolume =
mriVolume(:,:,1) = 0.9117 0.3054 0.8743 0.6790 0.5029 0.9291 0.4444 0.7229 0.0910 mriVolume(:,:,2) = 0.7140 0.6320 0.6661 0.6696 0.3753 0.0985 0.1696 0.9075 0.6249 mriVolume(:,:,3) = 0.4784 0.9112 0.7842 0.8221 0.8651 0.3624 0.3684 0.6878 0.9057
imshow(mriVolume(:,:,1))
roi=drawpolygon('Position', [0,0; 2,0; 0,3]*1.7);
mriVolume=mriVolume.*(~roi.createMask) %Delete pixels inside polygon in each slice
mriVolume =
mriVolume(:,:,1) = 0 0 0.8743 0 0 0.9291 0 0.7229 0.0910 mriVolume(:,:,2) = 0 0 0.6661 0 0 0.0985 0 0.9075 0.6249 mriVolume(:,:,3) = 0 0 0.7842 0 0 0.3624 0 0.6878 0.9057
Cameron
Cameron 2024 年 2 月 2 日
Ah I see now, that's exactly what I'm looking for. Thanks!

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeBiomedical Imaging についてさらに検索

製品


リリース

R2023b

Community Treasure Hunt

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

Start Hunting!

Translated by