熔化样品的边缘检测与跟踪

Edge detection and tracking of melting sample

一般的问题是求一些material的熔化面的衰退率。

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

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

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

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

视频的第一张和最后一张图片:

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

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

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

hsv = rgb2hsv(img);

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

移动色相边界,使 HSV space 中的像素值云不分离。

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 中样本、火焰和背景的平均向量 space。

  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);

这看起来很合理。

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

总结:

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

我想您可以通过对图像的红色部分进行二值化来获得相当可重复的结果。