0

我有一个边缘图像[通过应用精明的边缘检测器获得]。在这一点上,我有一个关键点。我想获得具有同心(圆形+径向)箱的图像直方图,类似于 CD 或 DVD 中的扇区,以关键点为中心。

我打算这样做: 1. 在边缘图像上应用二进制蒙版 2. 在具有不同半径的图像上应用圆形+径向蒙版。3. 总结每个半径的所有像素值。

我被卡住的部分是2。我怎样才能同时获得圆形+径向面具?为了更清楚 - 假设我有一个图像 - 我想通过以周期角沿半径绘制同心圆和线来将其划分为 bin。

编辑

@anandr 提供的代码就像一个魅力,做了一些小的修改。但是,我们现在有很多 Angbins 和 Radbins,我们可以将它们组合成一组垃圾箱,如我在此处链接的图片中所描绘的那样吗?原因是我们必须将其展平为我们正在扫描的每个 bin 中具有值 1 的数量像素值的直方图。这可能吗?请告诉我!谢谢!

编辑 2

对于@anandr 之前给出的代码,如果我包括

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

部分之后tImg = cat(3,tR,tG,tB);?这会给我那个特定 bin 中值为 1 的像素数吗?

4

1 回答 1

0

正如@Parag 建议的那样,您必须检查每个像素相对于关键点的距离和角度。然后您可以使用该histc功能为您的像素分配适当的 bin 编号。检查下面的代码

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
于 2013-10-21T05:59:36.217 回答