c++ - 定义清晰但角度变化的图像的图像识别

标签 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

所以我们显然也需要在这里进行一些预处理工作。

霍夫线和 RANSAC

霍夫线和 RANSAC 可能能够为我们识别线,但我们如何获得图案位置?

其他我还不知道的

我对图像处理领域还很陌生,所以我很想听听任何其他适合这个简单而困难的图像记录问题的技术。

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

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

enter image description here

打火机在更远的地方。这绝对可以帮助我们对齐图像,对最佳方式的一些想法?。到目前为止,我已经想到了诸如计算非 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')

调整大小的图像:

resized

分段:

segmented

模板匹配:

2d cross-correlation

关于c++ - 定义清晰但角度变化的图像的图像识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23402327/

相关文章:

c++ - to_string 未在范围内声明

c++ - Mex 找不到 g++

matlab - 如何在 MATLAB 上开始 SVM 训练

MATLAB Function 模块输出作为虚拟总线

image-processing - av_interleaved_write_frame() : Connection reset by peer mjpeg : What is wrong with mjpeg stream, ffserver 和 ffplay?

c++ - 在 OpenCV 中将图像转换为彩色铅笔素描

c++ - PCL更改开始摄像头位置

c++ - 重载函数隐藏在派生类中

c++ - 检查是否存在一串始终通向同一顶点的方向

c - 数字图像处理