首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熔融样品的边缘检测与跟踪

熔融样品的边缘检测与跟踪
EN

Stack Overflow用户
提问于 2019-04-24 14:18:45
回答 2查看 145关注 0票数 2

一般的问题是求出某些材料熔化表面的退缩率。

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

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

软件: Matlab。附带的图像处理工具箱

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-24 19:28:52

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

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

代码语言:javascript
复制
hsv = rgb2hsv(img);

hue是周期性的,但在您的示例中,不幸的是红黄样本接近于0和接近1。

在色调中移动边界,以便HSV空间中的像素值的云不会分离。

代码语言:javascript
复制
h = hsv(:, :, 1);
h = mod(h + 0.5,1); % shift periodically
s = hsv(:, :, 2);
v = hsv(:, :, 3);

让我们来想象一下。

代码语言:javascript
复制
plot3(h(:), s(:), v(:), '.');
xlabel('hue');
ylabel('saturation');
zlabel('value');

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

通过简单的阈值处理,找到火焰、样本和背景的聚类中心。背景是值< 0.2的所有内容,而火焰和样本的值> 0.2,火焰的色调< 0.3,样本色调> 0.3。

代码语言:javascript
复制
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空间中样本、火焰和背景的平均向量。

代码语言:javascript
复制
  C = 
  0.55004      0.63657      0.79573
  0.23729      0.50927      0.50652
  0.42501      0.50855     0.085589

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

代码语言:javascript
复制
Y = [h(:), s(:), v(:)];
x = max(Y / C, 0);
x = reshape(x, size(img));

如果我们能在这里加强样本、火焰和背景的平滑度以及非负性,那就更好了,但我无法在合理的时间内做到这一点,并将其作为练习。

让我们来想象一下。

代码语言:javascript
复制
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压缩伪像可见,这将在一定程度上降低结果的准确性。让我们找出分离样本的边缘。

代码语言:javascript
复制
sample = imgaussfilt(x(:, :, 1), 3);
e = bwareafilt(edge(sample), 1);

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

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

代码语言:javascript
复制
figure;
[x, y] = ind2sub(size(e), find(e));
imshow(img);
hold on;
plot(y, x, 'g.', 'MarkerSize', 2);

这看起来很合理。

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

总结一下:

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

票数 2
EN

Stack Overflow用户

发布于 2019-04-24 21:12:11

我猜您可以通过对图像的红色分量进行二值化来获得合理的可重复结果。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55823514

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档