Find light grey circle in greyscale image

3 Ansichten (letzte 30 Tage)
Benedikt Thomann
Benedikt Thomann am 2 Dez. 2022
Bearbeitet: Stephan am 8 Dez. 2022
Dear community,
I have a problem finding a circle in a greyscale image.
The image was taken with an X-ray scanner, through a circular shaped aperture and contains a ball/circle, approximately in the center of this aperture. I want to find the aperture circle and the (smaller) circle for the ball. I know the approximate radius, so I am specifying a range of radii to look for (since I have other circles in the image that I do not want to find).
The reason I am doing this is to exactly find the centers of these circles in order to evaluate whether the ball was placed at the exact center of the imager. I have a working code that does so, see example below.
Now to the problem:
I now have other images in which the images ball is of a different material and hence not as dark in the image. Unfortunately, I can't find a way to make my current code work for this "light grey" circle.
info = dicominfo('Gantry3-003.dcm');
img = dicomread(info);
img_BW = imbinarize(img,'adaptive','ForegroundPolarity','dark','Sensitivity',1);
SID = info.RTImageSID;
SSD = info.RadiationMachineSAD;
pxlsize_mm = info.ImagePlanePixelSpacing(1) /SID *SSD;
angle_Gantry = round(info.GantryAngle);
angle_Colli = round(info.BeamLimitingDeviceAngle);
angle_Table = round(info.PatientSupportAngle);
h = figure('Position', [2000, 100, 1400, 1000]);
subplot(1,2,1)
imshow(img,[]);
xlim([320,960]);
ylim([320,960]);
subplot(1,2,2)
imshow(img_BW);
xlim([320,960]);
ylim([320,960]);
[centersDark,radiiDark] = imfindcircles(img_BW,[10 20], ...
'ObjectPolarity','dark', 'Sensitivity',0.8);
[centersBright,radiiBright] = imfindcircles(img_BW,[20 30], ...
'ObjectPolarity','bright','Sensitivity',0.8);
numcirclesDark = length(centersDark)/2;
numcirclesBright = length(centersBright)/2;
hDark = viscircles(centersDark,radiiDark);
hBright = viscircles(centersBright, radiiBright,'Color','b');
This is the result (original image on the left, processed image with found circles on the right):
For the new image with a lighter colored ball in the center, it looks like this - I don't find this circle:
Unfortunately, I cannot attach dicom images, so I attached the images given above.
Any help would be greatly appreciated!
Also: If there is a simpler or better solution for my problem in general - feel free to comment! ;)
Thank you very much,
Benedikt
  1 Kommentar
Benedikt Thomann
Benedikt Thomann am 2 Dez. 2022
I forgot to mention:
I realize that my problem stems from binarizing the image. I am binarizing the image so that it is easier to find the circles. If there is any other/better way, any help would be welcome!

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Stephan
Stephan am 2 Dez. 2022
Bearbeitet: Stephan am 2 Dez. 2022
Maybe this is an approach:
img = imread('BinarizedImage_NewImage.JPG');
img2 = img;
img2(img2<240) = 0;
imshowpair(img,img2,'montage')
result is attached. The value 240 appears to work good - 235 gives similar results. You should play with the values. Once you have a suitable value, you can use imfindcircles as always.
  7 Kommentare
Stephan
Stephan am 7 Dez. 2022
Bearbeitet: Stephan am 8 Dez. 2022
@Image Analyst Im also interested in an alternative - probably more exact solution - to this.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Find more on DICOM Format in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!

Translated by