Matlab 灰度图像中的分水岭-局部极小值
我有一组灰度图像,需要定位局部极小值。我正在用Matlab编写代码,我正在寻找关于如何构造算法的建议:我需要计算梯度还是可以只使用Matlab 灰度图像中的分水岭-局部极小值,matlab,image-processing,watershed,Matlab,Image Processing,Watershed,我有一组灰度图像,需要定位局部极小值。我正在用Matlab编写代码,我正在寻找关于如何构造算法的建议:我需要计算梯度还是可以只使用分水岭函数 这是我用来进行第一次分析的代码(下图): 直观地说,我希望在箭头指向的像素中找到区域极小值: 您的问题是图像非常嘈杂。您应该对其进行模糊处理,以便消除局部噪声。 例如,您可以使用高斯或框模糊或形态学平滑,例如,使用闭合操作 我不确定分水岭是不是正确的工具。形态学腐蚀在每个像素的定义邻域中指定局部极小值。从腐蚀图像中减去原始图像,阈值为-1。剩余的非零像素
分水岭
函数
这是我用来进行第一次分析的代码(下图):
直观地说,我希望在箭头指向的像素中找到区域极小值:您的问题是图像非常嘈杂。您应该对其进行模糊处理,以便消除局部噪声。
例如,您可以使用高斯或框模糊或形态学平滑,例如,使用闭合操作
我不确定分水岭是不是正确的工具。形态学腐蚀在每个像素的定义邻域中指定局部极小值。从腐蚀图像中减去原始图像,阈值为-1。剩余的非零像素是局部极小值。您的问题是图像非常嘈杂。您应该对其进行模糊处理,以便消除局部噪声。
例如,您可以使用高斯或框模糊或形态学平滑,例如,使用闭合操作
我不确定分水岭是不是正确的工具。形态学腐蚀在每个像素的定义邻域中指定局部极小值。从腐蚀图像中减去原始图像,阈值为-1。剩余的非零像素是局部极小值。我想解决方案是使用梯度图像,遵循本文描述的算法。这个过程相当复杂,所以我
imerode
和imdeplate
清洁图像李>
IM_bin
),并将其用作过滤器,以便
如果IM_bin(x,y)>0IM_clean(x,y)=IM(x,y); 其他的 IM_clean(x,y)=0李>
imerode
李>
imregionalmax
查找区域最大值我猜解决方案是使用梯度图像,遵循本文描述的算法。这个过程相当复杂,所以我
imerode
和imdeplate
清洁图像李>
IM_bin
),并将其用作过滤器,以便
如果IM_bin(x,y)>0IM_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>代码>像素组成?如果你保存了所有的信息,那么局部极小值的数量就太大了。如果你只想指出那些极小值,你就必须去掉其他的,这就不可避免地意味着去掉信息。幸运的是,这些信息可以被定义为“噪音”。