【发布时间】:2012-08-05 01:43:07
【问题描述】:
我有一张图像 (200x200),想在具有预定义半径的特定点中查找邻域位置。例如,半径为 5,我在一个点周围有 25 个点。 MATLAB能做到吗?问题在于图像的边缘并不总是 25 个点,程序应该只找到该半径内的点。这些点可以从 1(角)到 25(图像中心)变化
【问题讨论】:
我有一张图像 (200x200),想在具有预定义半径的特定点中查找邻域位置。例如,半径为 5,我在一个点周围有 25 个点。 MATLAB能做到吗?问题在于图像的边缘并不总是 25 个点,程序应该只找到该半径内的点。这些点可以从 1(角)到 25(图像中心)变化
【问题讨论】:
这是一个例子:
%# 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 的优点是它以亚像素精度计算掩码(请阅读函数文档中的算法部分),前提是您使用了足够多的点来逼近圆。
【讨论】:
mask = false(imgH,imgW); mask(100:200,100:200) = true; 2) 如果您有 RGB 图像,您可以简单地沿第三维复制遮罩 repmat(mask,[1 1 3])(假设所有通道都被遮罩相同,否则分别处理每个 R、G、B 通道,然后与 cat(3,R,G,B) 组合回来
根据 cmets 中的讨论,我正在添加另一个解决方案。对于给定的点,我们计算指定步数内的相邻点(半径,如果你愿意的话)。这在 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
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
HTH
【讨论】:
scalespace_radii):pastebin.com/WkS5ShMf 欢迎任何关于如何改进计算的建议!
distance)。我在这里和那里进行了一些细微的更改以提高性能(例如更好的预分配、添加提前退出测试以及将一些计算移到循环之外)。如果你先创建一个新的问题页面,显示我的版本会更容易:)