我有一张图像 (200x200) 并希望在具有预定义半径的特定点中找到邻域位置。例如,半径为 5,我在一个点周围有 25 个点。MATLAB能做到吗?问题在于图像的边缘并不总是 25 个点,程序应该只找到该半径内的点。这些点可以从 1(角落)到 25(图像中心)变化
问问题
2938 次
2 回答
6
这是一个例子:
%# sample grayscale image
img = imread('cameraman.tif');
[imgH,imgW,~] = size(img);
%# circle params
t = linspace(0, 2*pi, 50); %# approximate circle with 50 points
r = 80; %# radius
c = [100 130]; %# center
%# get circular mask
BW = poly2mask(r*cos(t)+c(1), r*sin(t)+c(2), imgH, imgW);
%# show cropped image
imshow( immultiply(img,BW) )
axis on
这将很好地处理边缘情况。使用 POLY2MASK 的优点是它以亚像素精度计算掩码(请阅读函数文档中的算法部分),前提是您使用了足够多的点来逼近圆。
于 2012-08-08T01:17:52.447 回答
2
在评论中的讨论之后,我正在添加另一个解决方案。对于给定的点,我们计算指定步数内的相邻点(半径,如果你愿意的话)。这在 2D 和 3D 情况下都显示。
二维矩阵
siz = [10 15]; %# matrix size
p = [5 10]; %# 2D point location
%# neighboring points
k = 2; %# radius size
[sx,sy] = ndgrid(-k:k,-k:k); %# steps to get to neighbors
xy = bsxfun(@plus, p, [sx(:) sy(:)]); %# add shift
xy = bsxfun(@min, max(xy,1), siz); %# clamp coordinates within range
xy = unique(xy,'rows'); %# remove duplicates
xy(ismember(xy,p,'rows'),:) = []; %# remove point itself
%# show solution
figure
line(p(1), p(2), 'Color','r', ...
'LineStyle','none', 'Marker','.', 'MarkerSize',50)
line(xy(:,1), xy(:,2), 'Color','b', ...
'LineStyle','none', 'Marker','.', 'MarkerSize',20)
grid on, box on, axis equal
axis([1 siz(1) 1 siz(2)])
xlabel x, ylabel y
3D矩阵
siz = [10 15 8]; %# matrix size
p = [5 10 4]; %# 3D point location
%# neighboring points
k = 2; %# radius size
[sx,sy,sz] = ndgrid(-k:k,-k:k,-k:k); %# steps to get to neighbors
xyz = bsxfun(@plus, p, [sx(:) sy(:) sz(:)]); %# add shift
xyz = bsxfun(@min, max(xyz,1), siz); %# clamp coordinates within range
xyz = unique(xyz,'rows'); %# remove duplicates
xyz(ismember(xyz,p,'rows'),:) = []; %# remove point itself
%# show solution
figure
line(p(1), p(2), p(3), 'Color','r', ...
'LineStyle','none', 'Marker','.', 'MarkerSize',50)
line(xyz(:,1), xyz(:,2), xyz(:,3), 'Color','b', ...
'LineStyle','none', 'Marker','.', 'MarkerSize',20)
view(3), grid on, box on, axis equal
axis([1 siz(1) 1 siz(2) 1 siz(3)])
xlabel x, ylabel y, zlabel z
高温高压
于 2012-08-08T16:52:54.067 回答