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

时间:2014-05-01 05:05:43

标签: c++ matlab image-processing matlab-cvst

问题

我有一张从摆动车上拍摄的照片。为简单起见,我将其转换为黑白图像。示例如下所示:

Figure 1

图像显示高强度返回并且在其中具有图案,发现所有有效图像都以红色圈出。该图像可以根据车辆的旋转从多个角度拍摄。另一个例子是:

enter image description here

这里的目的是尝试识别存在该模式的图像单元。

当前的方法

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

SURF(加速功能强大)功能识别

我尝试了SURF的默认matlab实现来尝试查找功能。 Matlab SURF能够识别2个示例中的特征(与上述不同),但是,它无法识别常见的特征:

enter image description here

我知道这些点不同,但模式仍然可以识别。我尝试了多套图片,几乎没有共同点。从阅读关于SURF看来,无论如何它对于倾斜的图像似乎都不健壮。 或许有一些关于预处理的建议吗?

模板匹配

因此尝试了模板匹配,但对于应用程序来说绝对不是理想的,因为它不适合缩放或偏斜变化。我愿意预先处理想法来解决这个问题。这可能很容易,关于图片的额外信息的一些讨论将进一步提供。

现在让我们调查模板匹配:假设我们有以下两个图像作为模板和当前图像:

enter image description here

模板选自最前向的图像之一。在非常相似的图像上使用它我们可以匹配位置:

enter image description here

但是后来(有些明显)如果我们将图片改变到不同的角度,它就不会工作。当然我们期望这样,因为模板不再像图像中的模式:

enter image description here

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

Hough Lines和RANSAC

霍夫线和RANSAC可能能够为我们识别线条,但是我们如何获得模式位置?

我还不了解的其他

我对图像处理场景很陌生,所以我很想听听任何其他适合这种简单但困难的图像记录问题的技巧。

传感器及其如何帮助预处理

传感器是一个3D激光器,它已经变成了这个实验的图像,但仍然保留了它的距离信息。如果我们绘制的距离从0到255缩放,我们得到以下图像:

enter image description here

更轻的地方。这绝对可以帮助我们调整图像, 最佳方式的一些想法? 。到目前为止,我已经想过计算不是0的单元格的法线,我们也可以做一些梯度下降或最小二乘法拟合使得距离的差异为0,这可以使图像对齐以便它永远是直的。问题是白色条纹是否更远?也许我们可以将其细分?我们在算法上构建算法,所以我们需要小心,这样就不会成为怪物。

任何帮助或想法都会很棒,我很乐意研究任何认真的答案!

6 个答案:

答案 0 :(得分:4)

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

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

Trained template

Matched template

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

答案 1 :(得分:4)

我想出了以下程序来分割区域,并希望使用模板匹配找到感兴趣的模式。我已经添加了一些注释和图标题来解释流程和一些结果图像。希望它有所帮助。

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

调整图片大小:

resized

分段:

segmented

模板匹配:

2d cross-correlation

答案 2 :(得分:4)

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

根据我们的经验,我不认为SURF是正确的方法,正如其他地方指出的那样,假设连续的2D图像不是二进制的,并且会在您的情况下中断。模板匹配对于这种二进制图像也不好 - 您的像素只需稍微不对齐即可返回低匹配分数,因为像素值中没有局部空间相干性来减轻窗口的轻微错位。

我们的方法是这种情况是尝试转换&#34;将二进制图像转换为连续或&#34;灰度&#34;图片。例如,见下文:

Converting line-art to continuous field via edge orientation extrapolation

这些转换是通过运行一阶导数边缘检测器来完成的,例如:卷积3x3模板[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方便,但它不会给出准确的结果。

现在我们有了#34;连续&#34;图像(根据上图的右侧列)。灰度图案对图像中的局部结构进行编码,更适合基于梯度的描述符,如SURF和模板匹配。

我的预感是首先尝试模板匹配,但由于这是仿射敏感的,我会全力以赴,再次使用HOG / Bag of Visual words方法,就像我们在上面的论文中一样,以匹配这些模式。

我们发现这条管道在基于草图的形状识别方面给出了最先进的结果,我的博士生已成功用于后续工作中匹配象形文字,所以我认为它可以很好地适应这种模式你在你的示例图像中摆出姿势。

答案 3 :(得分:3)

我会:

  1. 分段图片

    Z坐标(距摄像机/激光的距离)Z坐标跳跃超过阈值时,对象与背景之间存在边界(如果相邻Z值大或超出范围)或另一个对象(如果相邻Z值不同)或其自身(如果相邻Z值不同但可以连接到自身)。这将为您提供一组对象

  2. 与观众对齐

    计算每个物体的边界点(大多数外边缘),通过atan2计算方向,然后旋转回相机垂直。

    您的图像看起来像标记标记,因此在这种情况下围绕Y轴旋转就足够了。您还可以将对象的大小缩放到预定义的距离(如果目标始终具有相同的大小)

    您需要知道相机系统的 FOV ,并为此校准Z轴。

  3. 现在尝试识别对象

    这里使用你现在拥有的东西,也可以添加像跳过对象那样的大小或宽高比不匹配的过滤器...你可以使用 DFT / DCT 或比较标准化/均衡图像的直方图等......

  4. <强> [PS]

    对于功能来说,使用BW-Bit图像并不是一个好主意,因为您丢失了太多信息。使用灰度或颜色代替(灰度通常就足够了)。我通常会在感兴趣的点周围添加一些小区域(几乎不同的半径)的简化直方图,这些直方图在旋转时是不变的。

答案 4 :(得分:3)

我不认为SURF是在这里使用的正确方法。 SURF设计用于常规2D强度图像,但您在此处拥有的是3D点云。有一种称为迭代闭点(ICP)的点云登记算法。 MATLAB文件交换有几种实现,例如this one

修改 计算机视觉系统工具箱现在(截至R2015b版本)包括点云处理功能。有关点云注册和拼接,请参阅this example

答案 5 :(得分:0)

看一下对数极坐标模板,它是旋转和尺度不变的: http://etd.lsu.edu/docs/available/etd-07072005-113808/unrestricted/Thunuguntla_thesis.pdf