正如@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