我希望在2D数据中找到峰值区域(如果您愿意,可以通过Hough变换创建灰度图像或2D景观)。 峰值区域我的意思是局部最大峰值,但 不是单点 ,而是周围的一部分<强大的> 贡献区域 随之而来。我知道,这是一个模糊的定义,但也许 mountain 这个词或下面的图片会让你直截了当地说出我的意思。
标记为红色(1-4)的峰是我想要的,粉红色(5-6)示例中的#34;灰色区&#34;,如果那些较小的峰是没找到,但如果他们也没关系。
图像包含1-20个峰值区域,高度不同。上面的冲浪图的2D数据如下所示,可能的结果(橙色对应峰值1,绿色对应峰值2 a / b,......)。测试的单个图像可以在描述链接中找到:
剩下的图片:input image - - - - mid:(okaish)result - - - - 对:结果覆盖在图像上。
上面的结果是使用简单的阈值处理(MATLAB代码)生成的:
% thresh_scale = 15; % parameter: how many thresholding steps
% thresh_perc = 6; % parameter: threshold at which we clip
thresh = multithresh(H,thresh_scale);
q_image = imquantize(H, thresh);
q_image(q_image <= thresh_perc) = 0; % regions under threshold are thrown away
q_image(q_image > thresh_perc) = 1; % ... while all others are preserved
q_image = imbinarize(q_image); % binarize for further processing
B = bwareaopen(q_image, nhood_minsize); % Filter really small regions
[L, L_num] = bwlabel(B); % <- result % Label connected components
如果有很少的相似峰值,像这些(15和6)这样的值通常可以正常工作,但如果存在更多峰值或者它们变化很大,则这不是一致的。我主要有两个问题,也可以通过简单地调整参数来修复:
我也不想要一个巨大的高峰区域,所以峰值区域应该被定义为山峰的一定比例。我认为不是全局阈值,而是有一种方法可以找到相对于它们的直接环境的峰值区域。我研究了均值漂移和MSER分割,但这些分析似乎适合分割真实图像,而不是合成数据。
不知怎的,我想象用一定量的水填充景观的负面将给我我正在寻找的区域:盆地,填充和扩散周围区域的形状。就像在图像下方倒水一样,所形成的水池也是我正在寻找的区域。
我认为这就是洪水填充或分水岭算法所做的事情,但是洪水填充似乎完全不同于其他分水岭的结果根本不是我想到的,也是在应用一些我认为可能有帮助的预处理时(截止为1) / 10):
或者使用与上述示例相同的限幅阈值(截止为6/15):
使用此代码(MATLAB)生成:
thresh = multithresh(H, 10); % set to either 10 || 15 for the examples
q_image = imquantize(H, thresh);
mask = false(size(q_image)); % create clipping mask...
mask(q_image > 1) = true; % ... to remove lowest 10% || lowest 6/15
% show with: figure, imshow(mask);
% OPTIONAL: Gaussian smoothing
H = imgaussfilt(H, 2); % apply before adding Inf values
% OPTIONAL: H-minima transform
H = imhmin(H, 10); % parameter is threshold for suppressing shallow minima
H = -H; % Complement the image
H(~mask) = Inf; % force "ground" pixels to Inf
L = watershed(D);
L(~mask) = 0; % clip "ground" from result
imshow(label2rgb(L,'lines',[.5 .5 .5])); % show result
我现在的问题: 是否有算法可以填充景观并为我提供生成的水池(用于灌注各种水量)来做我和我是否尝试用上述方法实现?或欢迎提出任何其他建议。我正在实现MATLAB(或者如果需要Python),但我可以使用任何代码或pseude-code。
为了将其与this question区分开,我的最大值不会被零值分隔。我想要的是类似的,但没有任何建议有帮助(爬山/模拟退火只会给你一点......)。
This question也很有意思,但它解决了约束问题(假设恰好有5个特定大小的峰值),这使得建议的方法对我的情况无用。
答案 0 :(得分:2)
在这些高峰发现问题中,我主要使用形态学操作。由于霍夫变换结果大多是噪声,我更喜欢先模糊它,然后应用tophat和扩展的最大值变换。然后,对于每个局部最大值,使用自适应阈值找到它周围的区域。以下是示例代码:
im=imread('udIuy.png');
% blur
im=imgaussfilt(im,1);
% tophat transform
im2=imtophat(im,strel('disk',5));
% extended maximums
im3=imextendedmax(im2,10);
% Extract each blob
s=regionprops(im3,'Centroid','PixelIdxList');
figure,imagesc(im),axis image
for i=1:numel(s)
x=ceil(s(i).Centroid);
tmp=im*0;
tmp(s(i).PixelIdxList)=1;
tmp2=tmp.*im2;
% The maximum amplitude and location
[refV,b]=max(tmp2(:));
[x2,y2]=ind2sub(size(im),b);
% select the region around local max amplitude
tmp=bwselect(im2>refV*0.6,y2,x2,4);
[xi,yi]=find(tmp);
hold on, plot(yi,xi,'r.')
hold on, text(y2+10,x2,num2str(i),'Color','white','FontSize',16)
end