分水岭 - 灰度图像中的局部最小值

时间:2015-05-05 13:01:16

标签: matlab image-processing watershed

我有一组灰度图像,我需要找到局部最小值。我正在使用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));

enter image description here

直观地说,我期望在箭头指向的像素中找到区域最小值:
enter image description here

3 个答案:

答案 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);

原始图像上覆盖的最小值如下所示 -

http://i.stack.imgur.com/bPHh0.png

您可以尝试使用结构元素的大小/形状来查看是否获得了更好的结果。

您还可以使用极值作为种子在渐变图像上执行分水岭分割,但这可能不会产生有意义的结果(看起来您似乎无法尝试执行分割)。

答案 2 :(得分:1)

我想解决方案是使用渐变图像,遵循this论文中描述的算法。这个程序非常复杂,所以相反我

  1. 使用imerodeimdilate;
  2. 清除图像
  3. 制作图像的二值化版本(IM_bin)并将其用作过滤器,以便使用它 如果IM_bin(x,y)> 0
        IM_clean(x,y)= IM(x,y); 其他     IM_clean(x,y)= 0;
  4. 再次使用imerode;
  5. 使用imregionalmax查找区域最大值。