首页 > 解决方案 > 熔化样品的边缘检测和跟踪

问题描述

普遍的问题是找到一些材料熔化表面的衰退率。

我尝试实现内置边缘检测过滤器来检测前边缘(图像中的左侧),但由于边缘不清晰,过滤器还检测到图像中的许多其他边缘。强度或任何 RGB 颜色导数的简单最大搜索也不起作用。

目前,我的方法是将样本周围环境的所有颜色(深黑色和蓝色)转换为零,只留下样本的颜色。然后,基于导数和第一局部最大值,检测前沿。问题是我不知道如何定义这个蓝色和深色的颜色范围来过滤掉。例如,图像前面这种蓝色的亮度会随着视频的变化而变化,我无法对所有图像进行过滤。

软件:Matlab。包括图像处理工具箱

这不是代码的问题,它更多的是一种概念和方式。

视频的第一张也是最后一张图片:

输入 1

最后一张图像的边缘检测成功(蓝线)。

输入 1

标签: matlabedge-detectionimagefilter

解决方案


在您的图像中,您有三个部分:样本(黄红色)、火焰(蓝白色)和背景(深色),但是样本和火焰在您想要检测边缘的区域重叠。将火焰与样品分开会很好,显而易见的方法似乎是通过颜色以某种方式将其分开。我玩了一下,这就是我想出的。

首先,将 RGB 图像转换为 HSV,我们基本上只有一个颜色通道(色调)。

hsv = rgb2hsv(img);

色调是周期性的,但在您的情况下,不幸的是,红黄色样本接近于零且接近于 1。

移动色调的边框,使 HSV 空间中的像素值云不分离。

h = hsv(:, :, 1);
h = mod(h + 0.5,1); % shift periodically
s = hsv(:, :, 2);
v = hsv(:, :, 3);

让我们形象化它。

plot3(h(:), s(:), v(:), '.');
xlabel('hue');
ylabel('saturation');
zlabel('value');

在此处输入图像描述

火焰和样品似乎在色调上分离得很好(部分饱和度也是如此——火焰的饱和度低于样品)。

通过简单的阈值化查找火焰、样本和背景的聚类中心。背景是值 < 0.2 的一切,而火焰和样本的值 > 0.2,火焰的色调 < 0.3,样本色调 > 0.3。

T1 = 0.3; % threshold on hue (>T1 is sample)
T2 = 0.2; % threshold on value (<T2 is background)
m = h > T1 & v > T2;
sample = [mean(h(m)), mean(s(m)), mean(v(m))];
m = h < T1 & v > T2;
flame = [mean(h(m)), mean(s(m)), mean(v(m))];
m = v < T2;
background = [mean(h(m)), mean(s(m)), mean(v(m))];
C = [sample; flame; background];

让我们看看 HSV 空间中样本、火焰和背景的平均向量。

  C = 
  0.55004      0.63657      0.79573
  0.23729      0.50927      0.50652
  0.42501      0.50855     0.085589

现在是有趣的部分。让我们将图像像素表示为这三个元素的线性组合。

Y = [h(:), s(:), v(:)];
x = max(Y / C, 0);
x = reshape(x, size(img));

如果我们可以在此处强制执行样本、火焰和背景的平滑度以及非负性,那就更好了,但我无法在合理的时间内实现它并将其留作练习。

让我们形象化它。

figure;
labels = {'sample', 'flame', 'background'};
for i = 1 : 3
    subplot(1,3,i);
    imagesc(x(:, :, i));
    axis image;
    title(labels{i});
end
colormap(gray);

在此处输入图像描述

重叠的样品和火焰被分离(但在进一步处理之前需要一些平滑)。有一些可见的 JPEG 压缩伪影,这将在一定程度上降低结果的准确性。让我们找到分离样本的边缘。

sample = imgaussfilt(x(:, :, 1), 3);
e = bwareafilt(edge(sample), 1);

在这里,另外只保留了最长的边。也可以使用火焰区域作为前边缘的指示器。

让我们将原始图像与检测到的边缘一起可视化。

figure;
[x, y] = ind2sub(size(e), find(e));
imshow(img);
hold on;
plot(y, x, 'g.', 'MarkerSize', 2);

在此处输入图像描述

这看起来很合理。

视频的最后一帧效果同样好。我在没有进一步调整参数的情况下得到了一个很好的结果,尽管这会有所帮助。

在此处输入图像描述

作为总结:

火焰和样品通过颜色(色调)分离,然后对分离的样品应用通用边缘检测。火焰可用作前边缘感兴趣区域的指示。分离(阈值)和边缘检测(平滑、阈值)中有一些内部参数需要调整。


推荐阅读