【问题标题】:Watershed - local minima in greyscale image分水岭 - 灰度图像中的局部最小值
【发布时间】:2015-05-05 13:01:15
【问题描述】:

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

直观地说,我希望在箭头所指的像素中找到区域最小值:

【问题讨论】:

标签: matlab image-processing watershed


【解决方案1】:

您的问题是图像非常嘈杂。您应该对其进行模糊处理,以便消除局部噪音。
例如,您可以使用高斯或框模糊或形态平滑,例如关闭操作。

我不确定分水岭是正确的工具。形态学侵蚀在每个像素的定义邻域中分配局部最小值。从侵蚀图像中减去原始图像,阈值为-1。剩余的非零像素,是局部最小值。

【讨论】:

  • 嗨,我不希望模糊图像以保留所有信息。使用watershed时有没有办法考虑只由至少n像素组成?
  • @albus_c,如果你保留所有信息,那么局部最小值的数量就是那么大。如果您只想指出那些最小值,则必须删除其他最小值,这不可避免地意味着要摆脱信息。幸运的是,这些信息可以被称为“噪音”。
【解决方案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);

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

您可以试验结构元素的大小/形状,看看是否能得到更好的结果。

您也可以使用极值作为种子对梯度图像执行分水岭分割,但这可能不会产生有意义的结果(看起来您似乎并没有尝试执行分割)。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-15
      • 2011-07-29
      • 1970-01-01
      • 1970-01-01
      • 2012-12-24
      • 1970-01-01
      相关资源
      最近更新 更多