一般的问题是求出某种材料的熔化表面的凹陷率。
我尝试实现内置的边缘检测滤镜以检测前边缘(图像的左侧),但是由于边缘不清晰,因此滤镜也检测到图像中的许多其他边缘。简单的最大强度搜索或任何RGB颜色导数都无法正常工作。
当前,我的方法是将样本周围环境的所有颜色(深黑色和蓝色)转换为零,而仅保留样本颜色。然后,基于导数和第一局部最大值,检测前端。 问题是我不知道如何定义这个蓝色和深色的颜色范围以进行过滤。例如,图像前面的这种蓝色亮度会随着视频的变化而变化,我无法在所有图像上对其进行过滤。
软件:Matlab。包含图像处理工具箱
这不是代码问题,更多的是概念和方式。
视频的第一张和最后一张图片:
最后一张图像的边缘检测成功(蓝线)。
答案 0 :(得分:2)
在图像中,您可以分为三个部分:样本(黄红色),火焰(蓝白色)和背景(暗),但是样本和火焰在您要检测边缘的区域中重叠。最好将火焰与样品分开,明显的方法似乎是通过颜色将其分开。我玩了一下,这就是我想出的。
首先,将RGB图像转换为HSV,其中我们基本上只有一个颜色通道(色相)。
hsv = rgb2hsv(img);
hue是周期性的,但不幸的是,红黄色样本接近于零且接近于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);
哪个看起来合理
视频的最后一帧效果很好。尽管可以提供帮助,但我没有进一步调整参数就获得了很好的结果。
摘要:
火焰和样品通过颜色(色相)分离,然后对分离的样品进行常规边缘检测。火焰可以用作前边缘有趣区域的指示。间隔(阈值)和边缘检测(平滑,阈值)中需要调整一些内部参数。答案 1 :(得分:0)