2

我一直在拍摄图像并在其上绘制轮廓。我需要在三个类别中计算像素的数量和它们的位置(在 MATLAB 中)

  1. 曲线外的像素
  2. 曲线内的像素
  3. 曲线边界上的像素。

我曾尝试在 MATLAB 中使用 inpolygon。它可以计算内部和外部的像素,但不能计算边界上的像素。在边界上,它只计算那些直接通过小网格中心的那些。我还需要计算轮廓通过小网格的四个边缘中的任何一个的那些像素。

请帮忙。我提供了下面的代码。

%Polygon Plotting 
clc;clear all;close all;
I = imread('cameraman.tif');
I = imresize(I,[100 100]);
I = double(I(:,:,1));
imagesc(I,[0 255]);colormap(gray);
axis([1 size(I,1) 1 size(I,2)]);
[BW xi yi] = roipoly();  %select your own coordinates. 
X=xi;
Y=yi;
hold on;
contour(BW,'r');
hold off;
xa = 1 : size(I,2);
ya = 1 : size(I,1);
[x,y] = meshgrid(xa,ya);
[in on] = inpolygon(x,y,X,Y);
count1 = sum(sum(in));
count2 = size(I,1)*size(I,2) - count1; 
count3 = sum(sum(on));
%count1 = inside the polygon and on boundary
%count2 = outside the polygon
%count3 = on the boundary only
inside = zeros(count1,2);
outside = zeros(count2,2);
onthecurve = zeros(count3,2);
l=1;m=1;n=1;

    for i = 1:size(I,1)
        for j = 1:size(I,2)
            if in(i,j)==1
                inside(l,1)=i;
                inside(l,2)=j;
                l=l+1;
            end
            if in(i,j)==0
                outside(m,1)= i;
                outside(m,2)= j;
                m = m+1;
            end
            if on(i,j)==1
                onthecurve(n,1)= i;
                onthecurve(n,2)= j;
                n = n+1;
            end
        end
    end
figure,    
plot(inside(:,1),inside(:,2),'+g');
axis([1 size(I,1) 1 size(I,2)]);
hold on 
plot(outside(:,1),outside(:,2),'+r');
hold on
plot(onthecurve(:,1),onthecurve(:,2),'+b');
hold off

如果图像显示不正确,请参考链接: 1.原始图像和轮廓 2.绿色 - 内部,红色 - 外部

可以看出,轮廓上的点没有用蓝色标记。事实上,count3 几乎总是给出输出 0。所以 inpolygon 在计算边界上的点时效率不高。

如何修改我的代码以便也计算这些像素?谢谢大家。

4

1 回答 1

1

您可以使用它edge来检测黑白( BW) 图像(在本例中为输入多边形)的边界。

%% Polygon Plotting
I = imread('cameraman.tif');
imshow(I);
inBW = roipoly(); % Select your own coordinates.

%% Make BW matrices
outBW = ~inBW; % Find 'out'
edBW = edge(inBW); % Find the 'edge'
inBW(edBW) = 0; % Remove edge from 'in'
outBW(edBW) = 0; % Remove edge from 'out'

%% Show result
imshow(double(cat(3, inBW, edBW, outBW)))

还要显示所有像素都包含在 3 组中:

prod(size(I)) - sum(sum(inBW + outBW + edBW))

应该变为零。

希望能帮助到你。

于 2013-07-04T19:48:34.980 回答