图像识别良好定义但角度变化的图像

问题

我有一张从摇摆车拍摄的照片。 为了简单起见,我将它转换成黑白图像。 一个例子如下所示:

图像显示高强度的回报,并且有一个图案,发现所有有效图像都以红色圈出。 取决于车辆的旋转,可以从多个角度拍摄该图像。 另一个例子是在这里:

这里的意图是试图识别存在这种图案的图片单元。

目前的做法

到目前为止,我已经尝试了几种方法,我正在使用Matlab进行测试,但最终会在c ++中实现。 算法的时间效率是理想的,但是,我对任何建议感兴趣。

SURF(加速功能)功能识别

我尝试了SURF的默认matlab实现来尝试查找特征。 Matlab SURF能够识别2个例子中的特征(与上面不一样),但它不能识别常见的特征:

我知道这些观点是不同的,但是这种模式仍然有些可辨。 我尝试了多套图片,几乎没有共同点。 从阅读SURF看来,对于倾斜图像来说,它看起来并不健壮。 也许有关于预处理的一些建议?

模板匹配

所以尝试了模板匹配,但对于应用程序来说绝对不是理想的选择,因为它不适合缩放或偏斜变化。 我很乐意通过预处理思路来解决这个问题。 这可能很容易,关于图片的额外信息的一些讨论将在下面提供。

现在我们来研究模板匹配:假设我们有以下两个图像作为模板和当前图像:

该模板是从最前面的图像中选择的。 并使用它在一个非常相似的图像我们可以匹配的位置:

但是,如果我们将图片更改为不同的角度(并且有些显而易见),它将不起作用。 当然,我们期望这是因为模板不再像图像中的模式:

所以我们显然也需要一些预处理工作。

Hough Lines和RANSAC

Hough线和RANSAC可能能够为我们确定线条,但是我们如何获得图案位置?

其他我还不知道的

我对图像处理场景相当陌生,所以我很想听听任何其他技术,以适应这种简单但困难的图像识别问题。

传感器以及它如何帮助预处理

该传感器是一个三维激光,它已被转换成本实验的图像,但仍保留其距离信息。 如果我们绘制的距离从0到255缩放,我们得到以下图像:

更轻更远的地方。 这无疑可以帮助我们调整形象, 在最佳方式上提供一些想法? 。 到目前为止,我已经想到了计算不是0的单元的法线的问题,我们也可以做一些梯度下降或最小二乘拟合,使得距离的差异为0,这可以使图像对齐,以便它总是笔直。 那个问题是,实心的白色条纹更远? 也许我们可以分割出来? 我们正在对算法进行算法构建,因此我们需要小心谨慎,这样才不会变成怪物。

任何帮助或想法都会很棒,我很高兴看到任何认真的答案!


我想出了以下程序来分割区域,并希望通过模板匹配找到感兴趣的模式。 我添加了一些评论和图形标题来解释流程和一些生成的图像。 希望能帮助到你。

im = imread('sample.png');
gr = rgb2gray(im);
bw = im2bw(gr, graythresh(gr));

bwsm = imresize(bw, .5);

dism = bwdist(bwsm);
dismnorm = dism/max(dism(:));
figure, imshow(dismnorm, []), title('distance transformed')

eq = histeq(dismnorm);
eqcl = imclose(eq, ones(5));
figure, imshow(eqcl, []), title('histogram equalized and closed')

eqclbw = eqcl < .2; % .2 worked for samples given
eqclbwcl = imclose(eqclbw, ones(5));
figure, imshow(eqclbwcl, []), title('binarized and closed')

filled = imfill(eqclbwcl, 'holes');
figure, imshow(filled, []), title('holes filled')

% -------------------------------------------------
% template
tmpl = zeros(16);
tmpl(3:4, 2:6) = 1;tmpl(11:15, 13:14) = 1;
tmpl(3:10, 7:14) = 1;

st = regionprops(tmpl, 'orientation');
tmplAngle = st.Orientation;
% -------------------------------------------------     

lbl = bwlabel(filled);
stats = regionprops(lbl, 'BoundingBox', 'Area', 'Orientation');
figure, imshow(label2rgb(lbl), []), title('labeled')

% here I just take the largest contour for convenience. should consider aspect ratio and any
% other features that can be used to uniquely identify the shape
[mx, id] = max([stats.Area]);
mxbb = stats(id).BoundingBox;

% resize and rotate the template
tmplre = imresize(tmpl, [mxbb(4) mxbb(3)]);
tmplrerot = imrotate(tmplre, stats(id).Orientation-tmplAngle);

xcr = xcorr2(double(filled), double(tmplrerot));
figure, imshow(xcr, []), title('template matching')

调整后的图片:

分段:

模板匹配:


由于图像质量较差(低分辨率+二值化),我更喜欢模板匹配,因为它基于简单的全局相似性度量,并且不会尝试进行任何特征提取(样本中没有可靠的特征)。

但是你需要应用旋转模板匹配。 一种方法是预先计算模板的旋转实例,为每个角度执行匹配并保持最佳状态。

可以在比较中集成深度信息(如果有帮助的话)。


这与我们在实验室中识别手绘字符的问题非常相似,因为目标图案是二元的,分辨率低,并且易于变形。

根据我们的经验,我不认为SURF是正确的路径,正如其他地方指出的那样,假定连续的二维图像不是二进制图像,并且会破坏您的情况。 模板匹配对于这种二进制图像来说也不是很好 - 因为像素值没有局部空间连贯性来缓解窗口的轻微错位,所以您的像素只需略微错位即可返回低匹配分数。

我们的方法是尝试将二进制图像“转换”为连续或“灰度”图像。 例如见下面:

通过边缘方向外插将线条艺术转换为连续场

这些转换通过运行一阶导数边缘检测器来完成,例如卷积3×3模板[0 0 0; 1 0 -1; 0 0 0]并且它在图像I上转置以获得dI / dx和dI / dy。 在任何像素处,我们都可以从这两个场中获得边缘取向atan2(dI / dy,dI / dx)。 我们将这些信息视为素描像素(问题中的白色像素)以及黑色像素处未知的信息。 然后,我们使用拉普拉斯平滑假设来从白色像素中推断黑色像素的值。 详细信息在本文中:

http://personal.ee.surrey.ac.uk/Personal/J.Collomosse/pubs/Hu-CVIU-2013.pdf

如果这是一个主要的麻烦,你可以尝试使用距离转换,在Matlab中使用bwdist方便,但它不会给出准确的结果。

现在我们有了“连续”图像(按照上面图像的右侧栏)。 灰度模式对图像中的局部结构进行编码,并且更适合基于渐变的描述符,如SURF和模板匹配。

我的预感是首先尝试模板匹配,但由于这是仿制敏感的,我会走完整路,再次使用HOG / Bag的视觉单词方法,就像我们上面的文章中所述,以匹配这些模式。

我们发现这条管道可以为基于素描的形状识别提供最先进的结果,而我的博士生已经成功地用于后续的匹配象形文字的工作,所以我认为它可以很好地处理你构成的那种图案您的示例图像。

链接地址: http://www.djcxy.com/p/79641.html

上一篇: Image recognition of well defined but changing angle image

下一篇: Differences between Octave and MATLAB?