如何找到从暗线到灰色涂抹区域的边缘
How to find edge from dark line to grey smeared region
我正在尝试检测从黑色水平线到灰色涂抹前景的边缘。
所需的 edge/result 略微标记为红色。
到目前为止我尝试了什么:
我的方法是使用标准的 Chan-Vese 分割结合多种预处理方法,如高斯模糊、最大滤波器或形态学运算符(如侵蚀)。但是,当我在图像的下部初始化水平集函数时,轮廓卡在了所需边缘之前。
由于噪音我无法在不破坏图像重要信息的情况下去除,简单的方法如 sobel 或 prewitt 过滤可能会失败。
我的另一个方法是搜索图像的 maximum/minimum 列强度,并标记每列最暗的像素。
正如您所假设的那样,这也会失败,因为我正在寻找的边缘并不是唯一具有暗像素的部分,这就是为什么这种方法非常容易出错的原因。
编辑
蛇也无济于事。
标记为蓝色的活动轮廓只是越过边缘,轮廓在左侧和右侧卡住。我尝试的代码是取自 here.
的函数 Snake2D(I,P,Options)
如果你想帮助我,这是原图。
我认为您使用行并找到最大值的方法可能是最简单的。
您遇到的一个问题是区分两个主要最大值。为此,您可以应用粗略平滑,找到两个最大值之间的中间点(下图中的蓝线)。然后你可以只取较低的位,也就是你感兴趣的位,并找到这个位的最大值。
最后一步,只需将两个指数相加即可。
结果:
可以这样:
ib = imread('LHkm2.png'); %Read image
sz = size(ib); %get dimensions
for i = 1:sz(2)
[~, ind_mid(i)] = max(smooth(-double(ib(:, i)), 130));%First round
line_to_smooth = ib(ind_mid(i):end, i);%Get line with one maximum
[~, ind(i)] = min(smooth(double(line_to_smooth), 10));%Second round
ind(i) = ind(i) + ind_mid(i);%Add indices to get final position
end
imshow(ib,[]);
hold on;
plot(ind_mid, 'LineWidth', 3);
plot(ind, 'LineWidth', 3);
注意:您当然可以像任何其他图形一样平滑最后一行以消除这样的颠簸:
ind = smooth(ind, 10)
其中 10 是您的平滑度 window(越高越宽,参见 here。
我正在尝试检测从黑色水平线到灰色涂抹前景的边缘。 所需的 edge/result 略微标记为红色。
到目前为止我尝试了什么:
我的方法是使用标准的 Chan-Vese 分割结合多种预处理方法,如高斯模糊、最大滤波器或形态学运算符(如侵蚀)。但是,当我在图像的下部初始化水平集函数时,轮廓卡在了所需边缘之前。
由于噪音我无法在不破坏图像重要信息的情况下去除,简单的方法如 sobel 或 prewitt 过滤可能会失败。
我的另一个方法是搜索图像的 maximum/minimum 列强度,并标记每列最暗的像素。 正如您所假设的那样,这也会失败,因为我正在寻找的边缘并不是唯一具有暗像素的部分,这就是为什么这种方法非常容易出错的原因。
编辑
蛇也无济于事。
标记为蓝色的活动轮廓只是越过边缘,轮廓在左侧和右侧卡住。我尝试的代码是取自 here.
的函数 Snake2D(I,P,Options)如果你想帮助我,这是原图。
我认为您使用行并找到最大值的方法可能是最简单的。 您遇到的一个问题是区分两个主要最大值。为此,您可以应用粗略平滑,找到两个最大值之间的中间点(下图中的蓝线)。然后你可以只取较低的位,也就是你感兴趣的位,并找到这个位的最大值。 最后一步,只需将两个指数相加即可。
结果:
可以这样:
ib = imread('LHkm2.png'); %Read image
sz = size(ib); %get dimensions
for i = 1:sz(2)
[~, ind_mid(i)] = max(smooth(-double(ib(:, i)), 130));%First round
line_to_smooth = ib(ind_mid(i):end, i);%Get line with one maximum
[~, ind(i)] = min(smooth(double(line_to_smooth), 10));%Second round
ind(i) = ind(i) + ind_mid(i);%Add indices to get final position
end
imshow(ib,[]);
hold on;
plot(ind_mid, 'LineWidth', 3);
plot(ind, 'LineWidth', 3);
注意:您当然可以像任何其他图形一样平滑最后一行以消除这样的颠簸:
ind = smooth(ind, 10)
其中 10 是您的平滑度 window(越高越宽,参见 here。