2013-10-21 148 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