Fan*_*Fox 15 c++ matlab image-processing matlab-cvst
问题
我有一张从摆动车上拍下来的照片.为简单起见,我将其转换为黑白图像.一个例子如下所示:

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

这里的目的是尝试识别存在该模式的图像单元.
当前的方法
到目前为止,我已经尝试了几种方法,我使用Matlab进行测试,但最终将在c ++中实现.期望算法是时间有效的,但是,我对任何建议感兴趣.
SURF(加速鲁棒特征)特征识别
我尝试了SURF的默认matlab实现来尝试查找功能.Matlab SURF能够识别2个示例中的特征(与上面不同)但是,它无法识别常见的:

我知道点数不同但模式仍然有些可识别.我尝试了多套图片,几乎没有共同点.从阅读关于SURF看来,无论如何它对于倾斜的图像似乎都不健壮. 也许这里有一些关于预处理的建议?
模板匹配
因此尝试了模板匹配,但对于应用程序来说绝对不是理想的,因为它不适合缩放或偏斜变化.我愿意预先处理想法来解决这个问题.这可能非常简单,关于图片的额外信息的一些讨论将进一步提供.
现在让我们调查模板匹配:假设我们有以下两个图像作为模板和当前图像:

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

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

所以我们显然也需要一些预处理工作.
Hough Lines和RANSAC
霍夫线和RANSAC可能能够为我们识别线,但是我们如何获得模式位置?
其他我还不知道的
我对图像处理场景很陌生,所以我很想听听任何其他技术,以适应这个简单但困难的图像记录问题.
传感器及其如何帮助预处理
传感器是一个3D激光器,它已经变成了这个实验的图像,但仍然保留了它的距离信息.如果我们使用从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')
Run Code Online (Sandbox Code Playgroud)
调整图像大小:

分段:

模板匹配:
