离散空间广义霍夫变换。

来源:互联网 发布:java捕获被0除的异常 编辑:程序博客网 时间:2024/05/16 23:38

一般来讲广义霍夫变换是指把坐标空间的图像映射到参数空间,需要先确定转换到参数空间的函数关系式,这种转换是连续的,但是对于任意图形而言这种关系式往往很难确定,而且我们处理的图像本身就是离散的,不需要连续变换。对于有限长的曲线而言,只要确定对应每一个坐标对应的参数空间的映射表就能画出参数空间的离散曲线。之后根据累加值就可以识别任意曲线。代码实现如下:

clearvars;close all;target = imread('target.jpg');pic = imread('test.jpg');target = rgb2gray(target);pic = rgb2gray(pic);target = target<50;pic = pic<50;figure;imshow(target);figure;imshow(pic);[y,x] = find(target);cx = round(mean(x));cy = round(mean(y));x_map = cx-x;y_map = cy-y;[W,L] = size(pic);[ys,xs] = find(pic);h_space = zeros(W,L);for flag = [ys,xs]'    ycs = y_map + flag(1);    xcs = x_map + flag(2);    r_ind = ycs>0&ycs<=W&xcs>0&xcs<=L;    h_space = h_space + accumarray([ycs(r_ind),xcs(r_ind)],1,[W,L]);endfigure;imshow(h_space,[]);[yt,xt] = find(h_space == max(h_space(:)));pic_thunder = zeros(W,L);for ii = 1:length(yt)    pic_thunder = pic_thunder + accumarray([yt(ii)-y_map,xt(ii)-x_map],1,[W,L]);endpic_thunder = double(cat(3,ones(W,L),~pic_thunder,~pic));figure;imshow(pic_thunder);
目标图像:

测试图像:


参数空间:


结果:



这个结果虽然跟卷积实现模板匹配是一样的,但是计算时只计算了线条部分,计算量应该是比卷积实现模板匹配要少一些的,只不过我的代码多次使用accumarray导致速率比较慢,而且MATLAB应该对卷积进行了优化,所以实际上比用MATLAB的卷积要慢上很多。因此没有什么实际应用价值,不过对于帮助理解霍夫变换应该有一些帮助。每次accumarray得到的图像就是该像素点对应的所有可能的中心点的坐标,把所有像素点可能的中心点坐标加起来,累加值最高的就是目标图像的中心点坐标了。