我是靠谱客的博主 任性柚子,最近开发中收集的这篇文章主要介绍离散空间广义霍夫变换。,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

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]);
end
figure;
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]);
end
pic_thunder = double(cat(3,ones(W,L),~pic_thunder,~pic));
figure;
imshow(pic_thunder);
目标图像:

测试图像:


参数空间:


结果:



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

最后

以上就是任性柚子为你收集整理的离散空间广义霍夫变换。的全部内容,希望文章能够帮你解决离散空间广义霍夫变换。所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部