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

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 Kommentare

Matt J
Matt J am 31 Jan. 2024
Bearbeitet: Matt J am 31 Jan. 2024
If the process is going to have an interactive step in each slice, why are you fretting that it be fast?
Cameron
Cameron am 1 Feb. 2024
Bearbeitet: Cameron am 2 Feb. 2024
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.

Melden Sie sich an, um zu kommentieren.

 Akzeptierte Antwort

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 Kommentare

Wouldn't this just create a 2D matrix of ones matching the polygon, using a deprecated command?
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
Ah I see now, that's exactly what I'm looking for. Thanks!

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Mehr zu Biomedical Imaging finden Sie in Hilfe-Center und File Exchange

Produkte

Version

R2023b

Gefragt:

am 31 Jan. 2024

Kommentiert:

am 2 Feb. 2024

Community Treasure Hunt

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

Start Hunting!

Translated by