Unable to draw just the boundary of an image

1 回表示 (過去 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