Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 灰度图像中的分水岭-局部极小值_Matlab_Image Processing_Watershed - Fatal编程技术网

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

Matlab 灰度图像中的分水岭-局部极小值,matlab,image-processing,watershed,Matlab,Image Processing,Watershed,我有一组灰度图像,需要定位局部极小值。我正在用Matlab编写代码,我正在寻找关于如何构造算法的建议:我需要计算梯度还是可以只使用分水岭函数 这是我用来进行第一次分析的代码(下图): 直观地说,我希望在箭头指向的像素中找到区域极小值: 您的问题是图像非常嘈杂。您应该对其进行模糊处理,以便消除局部噪声。 例如,您可以使用高斯或框模糊或形态学平滑,例如,使用闭合操作 我不确定分水岭是不是正确的工具。形态学腐蚀在每个像素的定义邻域中指定局部极小值。从腐蚀图像中减去原始图像,阈值为-1。剩余的非零像素

我有一组灰度图像,需要定位局部极小值。我正在用Matlab编写代码,我正在寻找关于如何构造算法的建议:我需要计算梯度还是可以只使用
分水岭
函数

这是我用来进行第一次分析的代码(下图):

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

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


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

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


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

我想解决方案是使用梯度图像,遵循本文描述的算法。这个过程相当复杂,所以我

  • 使用
    imerode
    imdeplate
    清洁图像
  • 制作图像的二值化版本(
    IM_bin
    ),并将其用作过滤器,以便 如果IM_bin(x,y)>0
    IM_clean(x,y)=IM(x,y); 其他的 IM_clean(x,y)=0
  • 再次使用
    imerode
  • 使用
    imregionalmax
    查找区域最大值

  • 我猜解决方案是使用梯度图像,遵循本文描述的算法。这个过程相当复杂,所以我

  • 使用
    imerode
    imdeplate
    清洁图像
  • 制作图像的二值化版本(
    IM_bin
    ),并将其用作过滤器,以便 如果IM_bin(x,y)>0
    IM_clean(x,y)=IM(x,y); 其他的 IM_clean(x,y)=0
  • 再次使用
    imerode
  • 使用
    imregionalmax
    查找区域最大值

  • 正如Adi Shavit提到的,图像非常嘈杂。当直接在图像上使用分水岭时,这会导致过度分割(因为图像中存在许多极值)

    您确实需要执行某种预处理来平滑图像。如果不想使用模糊,可以在找到极值之前尝试形态学重建(
    imrecostruct

    % 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);
    
    覆盖在原始图像上的最小值如下所示-

    您可以对结构元素的大小/形状进行实验,以查看是否获得更好的结果


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

    如Adi Shavit所述,图像非常嘈杂。当直接在图像上使用分水岭时,这会导致过度分割(因为图像中存在许多极值)

    您确实需要执行某种预处理来平滑图像。如果不想使用模糊,可以在找到极值之前尝试形态学重建(
    imrecostruct

    % 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);
    
    覆盖在原始图像上的最小值如下所示-

    您可以对结构元素的大小/形状进行实验,以查看是否获得更好的结果


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

    问题是什么?这是您想要的吗?如果没有,你想要什么?问题是:如何避免过采样并有效地找到区域最小值?以非常直观的方式,我的最终目标是检测图中箭头所指的点问题是什么?这是你想要的吗?如果没有,你想要什么?问题是:如何避免过采样并有效地找到区域最小值?以非常直观的方式,我的最终目标是检测图中箭头所指的点。我更希望不要模糊图像,以保留所有信息。在使用<代码>分水岭?@ alBuScC时,有没有一种方法只能考虑至少由代码< n>代码>像素组成?如果你保存了所有的信息,那么局部极小值的数量就太大了。如果你只想指出那些极小值,你就必须去掉其他的,这就不可避免地意味着去掉信息。幸运的是,这些信息可以被限定为“噪声”。嗨,我不想模糊图像,这样可以保留所有信息。在使用<代码>分水岭?@ alBuScC时,有没有一种方法只能考虑至少由代码< n>代码>像素组成?如果你保存了所有的信息,那么局部极小值的数量就太大了。如果你只想指出那些极小值,你就必须去掉其他的,这就不可避免地意味着去掉信息。幸运的是,这些信息可以被定义为“噪音”。