Подсчитайте количество пикселей на многоугольнике

Я делал снимок и рисовал на нем контур. Мне нужно подсчитать количество пикселей и их положение в трех категориях (в MATLAB)

  1. Пиксели за пределами кривой
  2. Пиксели внутри кривой
  3. Пиксели, которые находятся на границе кривой.

Я пробовал использовать inpolygon в MATLAB. Он может считать пиксели внутри и снаружи, но не на границе. На границе учитываются только те, которые проходят непосредственно через центр небольших сеток. Мне также нужно подсчитать те пиксели, где контур проходит через любой из четырех краев маленькой сетки.

Пожалуйста помоги. Я предоставил код ниже.

%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 не очень эффективен при подсчете точек на границе.

Как я могу изменить свой код, чтобы подсчитать и эти пиксели? Спасибо всем.


person roni    schedule 04.07.2013    source источник


Ответы (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))

Должен стать нулевым.

Надеюсь, поможет.

person p8me    schedule 04.07.2013
comment
Спасибо! но я хотел выполнить эту функцию без использования оператора края. Любые другие предложения приветствуются. - person roni; 05.07.2013
comment
Еще я очень хотел рассчитать пиксели, которые находятся снаружи, внутри и на кривой. Я сделал это достаточно легко, используя цикл for. Затем я хотел отобразить графики и сравнить их с исходным контуром. Однако они не похожи. Это связано с тем, что в изображении точка (1,1) находится в верхнем левом углу, тогда как в матрице в Matlab (1,1) находится в самом нижнем левом положении. Как я могу перевернуть ось Y в команде построения графика? - person roni; 05.07.2013
comment
Если вы не хотите использовать команду edge, вы можете написать свою собственную функцию обнаружения кромок, я почти уверен, что существует множество алгоритмов для обнаружения кромок. О сопоставлении индексов матрицы с изображением см. flipud . - person p8me; 05.07.2013