1

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

在此处输入图像描述

直观地说,我希望在箭头指向的像素中找到区域最小值:
在此处输入图像描述

4

3 回答 3

3

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

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

于 2015-05-05T14:10:34.670 回答
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

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

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

于 2015-05-06T11:59:46.370 回答
1

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

  1. imerode使用和清理图像imdilate
  2. 制作图像的二值化版本 ( IM_bin) 并将其用作过滤器,这样如果 IM_bin(x,y) > 0
    IM_clean(x,y) = IM(x,y); 否则 IM_clean(x,y) = 0;
  3. 再次使用imerode
  4. 使用 寻找区域最大值imregionalmax
于 2015-05-06T06:49:43.023 回答