2013-07-04 140 views
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. Original Image & Contour 2. Green - inside, Red - outside

如可以看出輪廓上的點不標記爲藍色。事實上,count3幾乎總是給出0的輸出。所以inpolygon在計算邊界上的點方面效率不高。

我該如何修改我的代碼以計算這些像素呢? 謝謝大家。

回答

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)) 

應該變成零。

希望它有幫助。

+0

謝謝!但我想在不使用邊緣運算符的情況下執行此功能。任何其他建議表示讚賞。 – roni

+0

另一件事,我真的想要計算外部,內部和曲線上的像素。通過使用for循環,我已經足夠容易完成了。然後我想顯示這些圖並將其與原始輪廓進行比較。但是它們並不相似。這是由於以下事實:在圖像中,點(1,1)位於最左上角,而在Matlab中的矩陣中,(1,1)位於最左下角位置。如何在繪圖命令中反轉我的y軸? – roni

+0

如果你不想使用'edge'命令,你可以編寫自己的邊緣檢測功能,我相當確定有很多邊緣檢測算法。關於將矩陣的索引與圖像進行匹配,請查看['flipud'](http://www.mathworks.com/help/matlab/ref/flipud.html)。 – pm89