Unable to draw just the boundary of an image

조회 수: 2 (최근 30일)
Warid Islam
Warid Islam 2021년 7월 19일
댓글: Warid Islam 2021년 7월 19일
Hi,
I want to draw just the boundary of a ROI. segFP1.jpg is the original image. I applied the code below but I don't get the desired result. My result is displayed in e1.jpg. Any suggestions would be appreciated. Thank you.
I=imread('segFP1.jpg');
figure,imshow(I)
I1=bwperim(I,8);
figure,imshow(I1)

채택된 답변

DGM
DGM 2021년 7월 19일
편집: DGM 2021년 7월 19일
Well, you're loading a grayscale image subject to destructive compression as a jpg file. At no point do you explicitly threshold the image, so it's probably just getting thresholded at I>0, and so a bunch of compression artifacts are part of the binarized image.
I=imread('segFP1.jpg'); % this is not a binary image
I = I>128; % threshold it somewhere
I1=bwperim(I,8); % otherwise this will
subplot(2,1,1)
imshow(I)
subplot(2,1,2)
imshow(I1)
  댓글 수: 3
DGM
DGM 2021년 7월 19일
편집: DGM 2021년 7월 19일
I'm not sure what's going on here, so let's back up and clarify variable names a bit.
I=imread('segFP1.jpg'); % intensity image
BW = I>128; % binarized image
BWP=bwperim(BW,8); % perimeter of BW
M = true(size(I)); % select everything
S = regionprops(M,I,'weightedcentroid');
C = S(1).WeightedCentroid
[y x] = find(BWP);
D = sqrt((C(1,1)-x).^2 + (C(1,2)-y).^2)
subplot(2,1,1)
imshow(I)
subplot(2,1,2)
imshow(BWP); hold on
plot(C(1,1),C(1,2),'x')
Given that you're taking the weighted centroid instead of the regular centroid (and given the syntax) it's implied that you're trying to operate on an intensity image, but instead, you're using the perimeter (so I made the substitution). If you're just trying to find the centroid of the perimeter, then you don't need to use M. You could just do:
S = regionprops(BWP,'centroid');
The weightedcentroid for a binary object is the same as its regular centroid.
If you're taking the weighted centroid of the intensity image, there is a difference between using M to select everything and doing something like this:
S = regionprops(BW,I,'weightedcentroid'); % the better way
because using BW to select the object cuts off all the garbage left behind by jpg compression, and any other noise in the image background -- which would otherwise influence the weighted average (centroid).
Unless you did something elsewhere, doing this:
x = I1(:, 2);
y = I1(:, 1);
just selects the first two columns of the perimeter image, which are all zero. Using find() will get the coordinates.
Warid Islam
Warid Islam 2021년 7월 19일
Hi @DGM,
That worked perfectly. Thanks a lot.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

제품


릴리스

R2020b

Community Treasure Hunt

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

Start Hunting!

Translated by