Radon变换(Matlb)

clear
clc
%只是尽量的大概的模拟出一个radon变换
%I = imread('Mark.bmp');
%I = imread('gantrycrane.png');
 I = imread('2Line.png');
I = rgb2gray(I);
% I(find(I==254))=0;  %2Line.png这个图用的
[m,n] = size(I);
x0 =(floor(m/2)+1);y0 =(floor(n/2)+1);%坐标原点 放中间了 所以p有正负两个值
xptemp = floor((floor(sqrt(m^2+n^2))+1)/2)+1;%p值得大小 就是图像对角线的长度的一半
xp = [-xptemp:1:xptemp];%为了画图用
xp = xp';
P = zeros(2*xptemp+1,180);%留着盛放变换结果
tic;
for t =1:180  %1:180 或者 0:179 为了方便 选择了1:180  
    ptemp = zeros(m,n);%为了刻画狄拉克δ函数
    ctemp = floor([(1-x0):(m-x0)].*cos((pi/180)*(t+90)))+1;%cos x 列 n  盛放了所有x*cos(t)
    stemp = floor([(1-y0):(n-y0)].*sin((pi/180)*(90+t)))+1;%sin y 行 m  盛放了所有x*sin(t)
        for i =1:n
        ptemp(:,i) = ctemp(:)';  %将对应的所有的x*cos(t)放入到ptemp中
        end
        for j =1:m
            ptemp(j,:) = ptemp(j,:)+stemp(:)';
            %将对应的所有的y*sin(t)与已经对应放入的x*cos(t)相加放入到ptemp中
        end
        
        %从这应该可以用积分,但是由于I是个二维矩阵,求积分时会报矩阵维度不一致,暂未找到解决办法。
%  附(不能用):   syms x y t p;
%         f = @(x,y,t,p) I.*(1.*(x*cos(t)+y*sin(t)-p~=0)+0.*(x*cos(t)+y*sin(t)-p==0));
%         g = @(t,p) integral2(@(x,y)f(x,y,t,p), , , ,);
%  最后代数,在f位置会报错 把I去掉就不会,不知道怎么改,也不确定式子是否有误。
        for p = -xptemp:1:xptemp             
            dtemp = dirac(p - ptemp);
            idx = dtemp ==Inf;dtemp(idx)=1;   
            % 将狄拉克δ函数刻画好后就是一条白色直线(二值图像)
            %因为t角度确定,p距离确定,dtemp和I是一样大的所以对应x,y,即x,y确定
            
            P(p+xptemp+1,t) = sum(sum(dtemp.*double(I)));
            %这用求和应该算是在算积分,最后会变成一个点,和自带radon变换对比貌似应该是
            %如果不求和,选出dtemp.*double(I)中出现次数最多的数(除0外)
            %达到一定阀值应该就是条直线,应该算是变成了用线模板进行线检测了
            
            
            %dtemp和I的点成的和应该是I在dtemp图像中这条线的所有像素值的和
            %radon变换的原理是将线通过线积分变换为点,直线检测是点的累计次数
            %一条线就是一个点,点越多线越清晰,
            %但是百度查到直线检测检测的是二维矩阵的峰值
            %使用findpeaks函数,可以通过限定阈值控制检测峰值的个数
            %得到峰值点,二维矩阵中有x,y,p,t所以能画出直线
            %但是注意坐标原点位置和角度变换,而且画出的为直线不是线段
            %百度有各种优化的和不同计算方式的radon变换,但是看不懂。
        end
end
toc;
t =1:180;
subplot(1,2,1),imagesc(t,xp,P),title('编的');colormap(hot);colorbar
tic;[R,XP] = radon(I);toc;
subplot(1,2,2),imagesc(t,XP,R),title('自带的');colormap(hot);colorbar
%由于没有使用积分,最后的结果全是整数,并且成像不太好。并且程序速度极低,太久了,
%这个程序算是只为了和自带的radon变换的到相似的结果
%radon变换将所有角度加了90度 ,没有想通为什么
%最后最高值比自带的radon变换要大

结果**

速度差很多,效果也不太好,图像越大,速度差的越多
在这里插入图片描述

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值