问题
我有一张从摇摆车里拍下来的照片。为了简单起见,我把它转换成黑白图像。下面是一个例子:

该图像显示高强度返回,并在其中有一个模式,发现它所有的有效图像是以红色圈。该图像可以从多个角度拍摄取决于车辆的旋转。另一个例子是:

这里的意图是试图识别该模式存在的图片单元格。
电流接近
到目前为止,我已经尝试了几种方法,我正在使用Matlab进行测试,但最终将在c++中实现。算法的时间效率是可取的,然而,我对任何建议都感兴趣。
SURF (加速鲁棒特征)特征识别
我尝试了默认的matlab实现冲浪尝试查找功能。Matlab SURF能够在两个示例中识别特征(与上面的不同),但是它无法识别常见的特征:

我知道这些点是不同的,但是模式还是可以识别的。我尝试了多组图片,几乎从来没有共同点。从阅读有关冲浪,似乎它是不健全的倾斜图像无论如何。可能会对这里的预处理提出一些建议?。
模板匹配
因此,模板匹配是尝试的,但肯定不是理想的应用程序,因为它是不健全的规模或倾斜的变化。我对预处理的想法持开放态度,以解决这个问题。这可能是相当容易,一些关于图片上的额外信息的讨论提供了进一步下去。
现在让我们研究模板匹配:假设我们有以下两个图像作为模板和当前图像:

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

但是如果我们把图片换到一个不同的角度,它就不起作用了。当然,我们期望这样做,因为模板不再像图像中的模式:

所以我们显然也需要做一些预处理工作。
Hough线与RANSAC
Hough线和RANSAC可能能够为我们识别这些线,但是我们如何获得模式位置呢?
其他我还不知道的
我是非常新的图像处理领域,所以我想听到任何其他的技术,将适合这个简单但困难的图像识别问题。
传感器及其将如何帮助预处理
该传感器是一种三维激光,为本实验制作了一幅图像,但仍保留着距离信息。如果我们用从0到255缩放的距离来绘制,我们会得到以下图像:

打火机更远的地方。这肯定可以帮助我们对齐图像,的一些想法,最好的方式?。到目前为止,我已经想到了一些事情,比如计算不是0的细胞的法线,我们也可以做一些梯度下降或者最小二乘拟合,这样距离上的差值是0,这样就可以对齐图像,使其始终是直线的。问题是,实心的白色条纹离得更远?也许我们能把它分割开?我们在算法上建立了一些算法,所以我们需要小心,这样才不会变成怪物。
任何帮助或想法都将是伟大的,我很高兴调查任何严肃的答案!
发布于 2014-05-11 02:06:15
我想出了下面的程序来分割区域,希望通过模板匹配找到感兴趣的模式。我添加了一些评论和图片标题来解释流程和一些由此产生的图像。希望能帮上忙。
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')调整大小的图像:

分段:

模板匹配:

发布于 2014-05-06 20:40:18
鉴于图像质量很差(低分辨率+二值化),我更喜欢模板匹配,因为它基于简单的全局相似性度量,并且不试图进行任何特征提取(样本中没有可靠的特征)。
但您将需要应用模板匹配与旋转。一种方法是预先计算模板的旋转实例,对每个角度执行匹配,并保持最佳状态。


可以在比较中集成深度信息(如果这有帮助的话)。
发布于 2014-05-11 20:36:25
这与我们在实验室处理的手绘字符识别问题非常相似,因为目标模式是二进制的,分辨率低,容易发生适度的变形。
根据我们的经验,我不认为冲浪是正确的方式,正如在其他地方指出,这假设一个连续的2D图像,而不是二进制,并将打破在你的情况。模板匹配对这种二值图像也不好-你的像素只需要稍微错对以返回一个低匹配分数,因为在像素值中没有局部的空间相干性,以减少窗口的轻微失调。
我们的方法是在这种情况下尝试将二进制图像“转换”为连续或“灰度”图像。例如,见下文:

这些转换是通过运行一个一阶导数边缘检测器来实现的,例如Convolve3x3模板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和模板匹配。
我的预感是先尝试模板匹配,但由于这是仿射敏感的,所以我会一路走下去,再次使用一种像我们在上面的论文中那样的“猪/袋”视觉词汇方法来匹配这些模式。
我们发现这条管道可以给出基于草图的形状识别的最先进的结果,我的PhD学生已经成功地用于后续的象形文字匹配工作,因此我认为它可以很好地处理您在示例图像中所呈现的那种模式。
https://stackoverflow.com/questions/23402327
复制相似问题