我有一组灰度图像,我需要找到局部最小值。我正在使用Matlab编写代码,我正在寻找有关如何构建算法的建议:我是否需要计算渐变?或者我可以使用watershed
函数吗?
这是我用来做第一次分析的代码(下图):
IM_c = imcomplement(IM);
L = watershed(IM_c);
Lrgb = label2rgb(L);
figure; hold on;
subplot(3,1,1); imshow(IM_c); hold on;
subplot(3,1,2); imshow(Lrgb);hold on;
subplot(3,1,3); imshow(imfuse(IM_c,Lrgb));
直观地说,我期望在箭头指向的像素中找到区域最小值:
答案 0 :(得分:3)
您的问题是图像非常嘈杂。你应该模糊它,以便消除局部噪音 例如,您可以使用高斯或盒子模糊或形态平滑,例如,密切操作。
我不确定分水岭是否是正确的工具。形态腐蚀在每个像素的定义邻域中分配局部最小值。从侵蚀的图像中减去原始图像,并将阈值减去-1。剩余的非零像素是局部最小值。
答案 1 :(得分:2)
正如Adi Shavit所说,图像非常嘈杂。当直接在图像上使用分水岭时,这会导致过度分割(因为图像上存在许多极值)。
您需要执行某种预处理以平滑图像。如果你不想使用模糊,你可以在找到极值之前尝试形态重建(imreconstruct
)。
% if img is your original grayscale image
wSize = 6;
se = strel('disk', wSize);
% opening by reconstruction - to remove specks in the dark background
imgEroded = imerode(img, se);
imgRecon = imreconstruct(imgEroded, img);
imgReconComp = imcomplement(imgRecon);
% opening by reconstruction - to homogenize the pixels in the foreground(clouds)
imgEroded2 = imerode(imgReconComp, se);
imgRecon2 = imreconstruct(imgEroded2, imgReconComp);
minima = imregionalmin(imgRecon2);
原始图像上覆盖的最小值如下所示 -
您可以尝试使用结构元素的大小/形状来查看是否获得了更好的结果。
您还可以使用极值作为种子在渐变图像上执行分水岭分割,但这可能不会产生有意义的结果(看起来您似乎无法尝试执行分割)。
答案 2 :(得分:1)
我想解决方案是使用渐变图像,遵循this论文中描述的算法。这个程序非常复杂,所以相反我
imerode
和imdilate
; IM_bin
)并将其用作过滤器,以便使用它
如果IM_bin(x,y)> 0 imerode
; imregionalmax
查找区域最大值。