2013-10-21 64 views
0

我有一個邊緣圖像[通過應用Canny邊緣檢測器得到]。在此我有一個關鍵點。我希望以關鍵點爲中心,以同心圓(圓形+放射狀)的方格獲得圖像的直方圖,類似於CD或DVD中的扇區。用一個點圍繞同心圓創建邊緣圖像的直方圖[Matlab]

我打算這樣做: 1.在邊緣圖像上應用二進制掩碼 2.對具有不同半徑的圖像應用圓形+徑向掩碼。 3.總結每個半徑的所有像素值。

我被卡住的部分是2.我怎樣才能同時獲得圓形+徑向面罩?爲了使它更清晰 - 假設我有一個圖像 - 我想通過在週期角度處繪製沿半徑的同心圓和線來將它分成兩個分箱。

編輯

通過@anandr就像一些小修改魅力所提供的代碼。但是,我們現在有一些Angbins和Radbins,我們可以將他們兩個都分成一組垃圾箱,如圖中我所鏈接的here?原因是我們不得不將其平化爲在我們正在掃描的每個倉中具有值1的數量像素值的直方圖。這可能嗎?請告訴我! 謝謝!

EDIT 2

對於@anandr了前面的代碼,如果我有

agg(ia,ir)=sum(abs(tImg(:))); 

tImg = cat(3,tR,tG,tB);部分之後? 這會給我在那個特定bin中值爲1的像素的數量嗎?

+0

您是否正在創建靶心圖? – user2816823

+0

對於要檢查的點,請檢查其與所需圓的中心的距離和角度。你會知道它落在哪個箱子裏。例如,距離= sqrt(x。^ 2 + y。^ 2),theta = atan2(y,x)...(在MATLAB中) –

+0

'tImg = cat(3,tR,tG,tB) '實際上建立了RGB圖像來突出顯示垃圾箱。紅色,綠色和藍色組件分別突出顯示徑向倉,角倉和它們的交集,因此對「tImg」進行求和是沒有意義的。我會說你必須'agg(ia,ir)= sum(Img(SectorMask)== 1);'來計數一個。 – anandr

回答

0

由於@Parag建議,您必須檢查每個像素相對於關鍵點的距離和角度。然後,您可以使用histc函數爲您的像素分配適當的箱號。檢查下面

function [RadialBins,AngularBins] = MakeRadCircMask(ImgRows,ImgCols, KeyRow,KeyCol, DistanceEdges, AngleEdges) 
    % [RadialMask,AngularMask] = MakeRadCircMask(ImgRows,ImgCols, KeyRow,KeyCol, DistanceEdges, AngleEdges) 
    % RADIALBINS is the distance bin number for bin edges specified in DISTANCEEDGES 
    % ANGULARBINS is the distance bin number for bin edges specified in ANGLEEDGES 
    % For pixels outside of min(DISTANCEEDGES):max(DISTANCEEDGES) -1 returned 
    % For pixels outside of min(ANGLEEDGES):max(ANGLEEDGES) -1 returned 
    x     = (1:ImgCols)-KeyCol; 
    y     = (1:ImgRows)-KeyRow; 
    [xx,yy]    = meshgrid(x , y); 
    d     = sqrt(xx.^2 + yy.^2); 
    a     = atan2(yy , xx); 
    [n,bin]    = histc(d,DistanceEdges); 
    RadialBins   = -ones(ImgRows,ImgCols); 
    RadialBins(bin>0) = bin(bin>0); 
    [n,bin]    = histc(a,AngleEdges*pi/180); 
    AngularBins   = -ones(ImgRows,ImgCols); 
    AngularBins(bin>0) = bin(bin>0); 
end 

% now we test the masks 

%Initial data 
ImgRows  = 100; 
ImgCols  = 200; 
DstEdges = 0:10:150; 
AngEdges = -180:30:180; 

NDstBins = length(DstEdges)-1; 
NAngBins = length(AngEdges)-1; 

%Create checkerboard image 
r   = 1:ImgRows; 
c   = 1:ImgCols; 
[cc,rr]  = meshgrid(c,r); 
Img   = (-1).^(round(rr/3) + round(cc/3)); 
Img(Img<0) = 0; 

% Calculate bins 
[RadialBins,AngularBins] = MakeRadCircMask(ImgRows,ImgCols, 50,150, DstEdges, AngEdges); 

% show the cartoon ;o) 
figure; 
subplot(2,2,1); imagesc(RadialBins); axis equal; axis tight; title('Radial bins'); 
subplot(2,2,2); imagesc(AngularBins); axis equal; axis tight; title('Angular bins'); 
subplot(2,2,3); imagesc(Img);   axis equal; axis tight; title('Original image'); 
subplot(2,2,4); imagesc(Img);   axis equal; axis tight; title('Selection image'); 
%return; 

for ir=1:NDstBins 
    % compute the radiaal mask 
    rMask  = RadialBins==ir; 

    for ia=1:NAngBins 
     % compute the angular mask 
     aMask  = AngularBins==ia; 

     % do some stuff with the images 
     tR    = zeros(ImgRows,ImgCols); 
     tG    = zeros(ImgRows,ImgCols); 
     tB    = zeros(ImgRows,ImgCols); 

     tR(aMask)  = Img(aMask); 
     tG(rMask)  = Img(rMask); 
     tB(rMask&aMask) = Img(rMask&aMask); 
     tR(rMask&aMask) = 0; 
     tG(rMask&aMask) = 0; 

     tImg   = cat(3,tR,tG,tB); 

     % and display the results 
     subplot(2,2,4); imagesc(tImg); axis equal; axis tight; 
     title({ 
      sprintf('Radial bin %d of %d (%.1f to %.1f);',ir,NDstBins,DstEdges(ir),DstEdges(ir+1)) 
      sprintf('Angular bin %d of %d (%.1f to %.1f);',ia,NAngBins,AngEdges(ia),AngEdges(ia+1)) 
      }) 
     drawnow; 
    end 

end 

UPD的代碼:代碼更新以處理外的範圍中的像素

EDIT1 變形是容易的,如果你需要可變數量的用於每個徑向條紋角度倉。然而,在這種情況下,每個徑向倉的扇區從一個開始編號到適當數量的角倉。所以如果你需要處理一個特定的扇區,你必須檢查徑向掩模和角度掩模。

function [RadialBins,AngularBins] = RadialGrid(ImgRows,ImgCols, KeyRow,KeyCol, DistanceMin,DistanceMax, NAngleBins,NDistanceBins) 
    % Grid = RadialGrid(ImgRows,ImgCols, KeyRow,KeyCol, DistanceMin,DistanceMax, NAngleBins,NDistanceBins) 
    % for details see http://stackoverflow.com/questions/19485118/creating-a-histogram-of-edge-image-with-concentric-circles-around-one-point-mat/19487198?noredirect=1#comment28938533_19487198 
    % 
    if ~isscalar(NDistanceBins) 
     error('NDISTANCEBINS must be scalar'); 
    end 
    if isscalar(NAngleBins) 
    NAngleBins   = ones(1,NDistanceBins)*NAngleBins; 
    end 
    if length(NAngleBins)~=NDistanceBins 
     error('NANGLEBINS must be scalar or vector of NDISTANCEBINS elements'); 
    end 

    DistanceEdges  = linspace(DistanceMin,DistanceMax,NDistanceBins+1); 
    x     = (1:ImgCols)-KeyCol; 
    y     = (1:ImgRows)-KeyRow; 
    [xx,yy]    = meshgrid(x , y); 
    d     = sqrt(xx.^2 + yy.^2); 
    a     = atan2(yy , xx); 
    [n,bin]    = histc(d,DistanceEdges); 
    RadialBins   = -ones(ImgRows,ImgCols); 
    RadialBins(bin>0) = bin(bin>0); 
    RadialBins(RadialBins>NDistanceBins) = -1; 
    AngularBins   = zeros(size(RadialBins))-1; 
    for kk=1:NDistanceBins 
    AngleEdges   = linspace(-180,+180,NAngleBins(kk)+1); 
    [n,bin]    = histc(a,AngleEdges*pi/180); 
    idx     = (bin>0) & (RadialBins==kk); 
    AngularBins(idx) = bin(idx); 
    end 
end 

ImgRows   = 400; 
ImgCols   = 400; 
NDistanceBins = 5; 
NAngleBins  = 2.^(1:NDistanceBins); 

%Create checkerboard image 
r    = 1:ImgRows; 
c    = 1:ImgCols; 
[cc,rr]   = meshgrid(c,r); 
Img    = (-1).^(round(rr/3) + round(cc/3)); 
Img(Img<0)  = 0; 

%  [RadialBins,AngularBins] = RadialGrid(ImgRows,ImgCols, ImgRows/2,ImgCols/2, 50,200, 2.^(1:NDistanceBins),NDistanceBins); 
%  figure; 
%  subplot(2,2,1); imagesc(RadialBins); axis equal; axis tight; title('Radial bins'); 
%  subplot(2,2,2); imagesc(AngularBins); axis equal; axis tight; title('Angular bins'); 
% 
%  [RadialBins,AngularBins] = RadialGrid(ImgRows,ImgCols, ImgRows/2,ImgCols/2, 50,200, (1:NDistanceBins)+1,NDistanceBins); 
%  subplot(2,2,3); imagesc(RadialBins); axis equal; axis tight; title('Radial bins'); 
%  subplot(2,2,4); imagesc(AngularBins); axis equal; axis tight; title('Angular bins'); 
%  colormap(jet(255)); 

[RadialBins,AngularBins] = RadialGrid(ImgRows,ImgCols, ImgRows/2,ImgCols/2, 50,200, NAngleBins,NDistanceBins); 

% show the cartoon ;o) 
figure; 
subplot(2,2,1); imagesc(RadialBins); axis equal; axis tight; title('Radial bins'); 
subplot(2,2,2); imagesc(AngularBins); axis equal; axis tight; title('Angular bins'); 
subplot(2,2,3); imagesc(Img);   axis equal; axis tight; title('Original image'); 
subplot(2,2,4); imagesc(Img);   axis equal; axis tight; title('Selection image'); 
%return; 

for ir=1:NDistanceBins 
    % compute the radiaal mask 
    rMask  = RadialBins==ir; 

    for ia=1:NAngleBins(ir) 
     % compute the angular mask 
     aMask  = AngularBins==ia; 

     % do some stuff with the images 
     tR    = zeros(ImgRows,ImgCols); 
     tG    = zeros(ImgRows,ImgCols); 
     tB    = zeros(ImgRows,ImgCols); 

     SectorMask  = rMask&aMask; 

     tR(rMask)  = Img(rMask); 
     tG(SectorMask) = Img(SectorMask); 
     tB(aMask)  = Img(aMask); 
     tImg   = cat(3,tR,tG,tB); 

     % and display the results 
     subplot(2,2,4); imagesc(tImg); axis equal; axis tight; 
     title({ 
      sprintf('Radial bin %d of %d;',ir,NDistanceBins) 
      sprintf('Angular bin %d of %d;',ia,NAngleBins(ir)) 
      }) 
     drawnow; 
    end 
end 
+0

我得到這個錯誤: 下標索引必須是實數 正整數或邏輯。(第12行)中的錯誤 RadialBins = HistcBins中的錯誤(第17行) [RadialBins,AngularBins] = MakeRadCircMask(ImgRows,ImgCols, 50,150,DstEdges,AngEdges); –

+0

我更新了示例代碼。它現在應該能夠正常工作並正確處理超出範圍的像素。 – anandr

+0

你的錯誤很奇怪。我剛剛從這裏複製了代碼,它工作。請檢查:http://pastebin.com/hrZt1711 – anandr