由於@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
您是否正在創建靶心圖? – user2816823
對於要檢查的點,請檢查其與所需圓的中心的距離和角度。你會知道它落在哪個箱子裏。例如,距離= sqrt(x。^ 2 + y。^ 2),theta = atan2(y,x)...(在MATLAB中) –
'tImg = cat(3,tR,tG,tB) '實際上建立了RGB圖像來突出顯示垃圾箱。紅色,綠色和藍色組件分別突出顯示徑向倉,角倉和它們的交集,因此對「tImg」進行求和是沒有意義的。我會說你必須'agg(ia,ir)= sum(Img(SectorMask)== 1);'來計數一個。 – anandr