How do I get the brightest pixels from this image?

3 visualizaciones (últimos 30 días)
Alexander Moody
Alexander Moody el 3 de Oct. de 2023
Comentada: Alexander Moody el 4 de Oct. de 2023
The image in question is above. I want to get the pixel values of the bright ring that lines the center of this uneven ring.
This was a binary image (kind of an uneven donut), then I did the distance transform of the image. What you see is the result.
There is a ridge along the middle of the donut that contains the brightest pixels (farthest from edge). I want to algorithmically obtain all of those pixel values or the locations in the image where those pixel values are.
Suggestions are welcome. I do not need a fully coded solution... unless you want a coding challenge.

Respuesta aceptada

Image Analyst
Image Analyst el 3 de Oct. de 2023
Editada: Image Analyst el 4 de Oct. de 2023
You should be able to use @bwskel to get the skeleton. Then use the skeleton as a mask to get the pixel values along the ridge. See attached example where I get the mean width by examining along the spine of the distance transform. If you wanted the pixel intensities instead of the diameters, you'd do
skelImage = bwskel(mask); % Get skeleton of the binary image (not the distance transform).
% Get 1-D vector of all the pixel intensities in the original image along the mask spine.
pixelSkelValues = grayImage(skelImage);
  1 comentario
Alexander Moody
Alexander Moody el 4 de Oct. de 2023
Excellent answer! Simple and very effective. Thank you!
I already tried it and it works really well. I forgot about bwskel() function because I never have a use for it.

Iniciar sesión para comentar.

Más respuestas (1)

DGM
DGM el 3 de Oct. de 2023
Editada: DGM el 3 de Oct. de 2023
See watershed()
% assuming D is a distance map
D = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/1500965/image.png');
D = im2gray(D);
% find the ridgeline
mask = ~watershed(D);
% visualize both
imshow(imfuse(mask,mat2gray(D)),'border','tight')
xlim([450 1280]) % zoom in so it's visible in the forum
ylim([550 1350])
% get the distance at the ridgeline (the local width)
Dridge = D(mask);
For most tasks, the mask can be used directly instead of trying to use subscripts. If you need subscripts for geometric purposes, use find().
This example has a different end goal, but it demonstrates the process of addressing image pixels using three different appcoaches: a mask, linear indices derived from the mask, and row/column subscripts derived from the mask.
That should serve to substantiate my recommendation to use the mask alone for addressing tasks.
  1 comentario
Alexander Moody
Alexander Moody el 4 de Oct. de 2023
You know, I was thinking about using a watershed, but the problem is that it doesn't capture the whole ring. This is a great answer though. I really appreciate your help. Thank you!

Iniciar sesión para comentar.

Community Treasure Hunt

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

Start Hunting!

Translated by