matlab - 熔化样品的边缘检测和跟踪
问题描述
普遍的问题是找到一些材料熔化表面的衰退率。
我尝试实现内置边缘检测过滤器来检测前边缘(图像中的左侧),但由于边缘不清晰,过滤器还检测到图像中的许多其他边缘。强度或任何 RGB 颜色导数的简单最大搜索也不起作用。
目前,我的方法是将样本周围环境的所有颜色(深黑色和蓝色)转换为零,只留下样本的颜色。然后,基于导数和第一局部最大值,检测前沿。问题是我不知道如何定义这个蓝色和深色的颜色范围来过滤掉。例如,图像前面这种蓝色的亮度会随着视频的变化而变化,我无法对所有图像进行过滤。
软件:Matlab。包括图像处理工具箱
这不是代码的问题,它更多的是一种概念和方式。
视频的第一张也是最后一张图片:
最后一张图像的边缘检测成功(蓝线)。
解决方案
在您的图像中,您有三个部分:样本(黄红色)、火焰(蓝白色)和背景(深色),但是样本和火焰在您想要检测边缘的区域重叠。将火焰与样品分开会很好,显而易见的方法似乎是通过颜色以某种方式将其分开。我玩了一下,这就是我想出的。
首先,将 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);
这看起来很合理。
视频的最后一帧效果同样好。我在没有进一步调整参数的情况下得到了一个很好的结果,尽管这会有所帮助。
作为总结:
火焰和样品通过颜色(色调)分离,然后对分离的样品应用通用边缘检测。火焰可用作前边缘感兴趣区域的指示。分离(阈值)和边缘检测(平滑、阈值)中有一些内部参数需要调整。
推荐阅读
- flutter - 如何为我的 Flutter Web 应用程序配置图标?
- c# - 当第一个字段的名称是动态的时,从 JSON 中获取值
- python-2.7 - 如何在 python 中将绘图图保存为离线图像(png、jpg 等)?
- node.js - Express Node.JS 后端、React 前端和 AWS 基础设施的 CORS 错误
- solr - SOLR 建议器返回值
- c++ - 数组的基本循环逻辑?
- python - Groupby 并用 pandas 污染字符串
- powershell - powershell基于csv重命名子文件夹中的文件
- string - 如何将 utf8 文字(即 '\u1F606')转换为符文?(不要从符文中获取 UTF8!)
- javascript - 如何在 Hichcharts 中显示所有注释?