赞
踩
实验四 滤波反投影算法的实验研究
1、利用”iradon”函数采用S-L与R-L滤波器进行滤波实现滤波反投影算法。
I=phantom(256);
theta=0:1:179;
P=radon(I,theta);
rec=iradon(P,theta,'linear','None');
rec_RL=iradon(P,theta,'Ram-Lak');
rec_SL=iradon(P,theta,'linear','Shepp-Logan');
figure;
subplot(2,2,1);imshow(I,[]),title('原始图像');
subplot(2,2,2);imshow(rec,[]),title('直接反投影图像');
subplot(2,2,3);imshow(rec_RL,[]),title('RL滤波反投影图像');
subplot(2,2,4);imshow(rec_SL,[]),title('SL滤波反投影图像');
2、利用FBP算法重建图像
1)对椭圆平行束投影数据进行滤波反投影重建,分别采用S-L与R-L滤波器进行滤波
clear; N=256; I = phantom('Shepp-Logan',N); delta=pi/180; theta=0:1:179; theta_num=length(theta); d=1; %%产生投影数据 P=radon(I,theta); [mm,nn]=size(P); e=floor((mm-N-1)/2+1)+1; P=P(e:N+e-1,:); P1=reshape(P,N,theta_num); %% fh_RL=medfuncRlfilterfunction(N,d); fh_SL=medfuncSlfilterfunction(N,d); %% rec=zeros(N); for m=1:theta_num pm=P1(:,m); Cm=(N/2)*(1-cos((m-1)*delta)-sin((m-1)*delta)); for k1=1:N for k2=1:N Xrm=Cm+(k2-1)*cos((m-1)*delta)+(k1-1)*sin((m-1)*delta); n=floor(Xrm); t=Xrm-floor(Xrm); n=max(1,n); n=min(n,N-1); p=(1-t)*pm(n)+t*pm(n+1); rec(N+1-k1,k2)=rec(N+1-k1,k2)+p; end end end %% rec_RL=zeros(N) for m1=1:theta_num pm1=P1(:,m1); pm_RL=conv(fh_RL,pm1,'same'); Cm1=(N/2)*(1-cos((m1-1)*delta)-sin((m1-1)*delta)); for k1=1:N for k2=1:N Xrm1=Cm1+(k2-1)*cos((m1-1)*delta)+(k1-1)*sin((m1-1)*delta); n1=floor(Xrm1); t1=Xrm1-floor(Xrm1); n1=max(1,n1); n1=min(n1,N-1); p1=(1-t1)*pm_RL(n1)+t1*pm_RL(n1+1); rec_RL(N+1-k1,k2)=rec_RL(N+1-k1,k2)+p1; end end end %% rec_SL=zeros(N) for m2=1:theta_num pm2=P1(:,m2); pm_SL=conv(fh_SL,pm2,'same'); Cm2=(N/2)*(1-cos((m2-1)*delta)-sin((m2-1)*delta)); for k1=1:N for k2=1:N Xrm2=Cm2+(k2-1)*cos((m2-1)*delta)+(k1-1)*sin((m2-1)*delta); n2=floor(Xrm2); t2=Xrm2-floor(Xrm2); n2=max(1,n2); n2=min(n2,N-1); p2=(1-t2)*pm_SL(n2)+t2*pm_SL(n2+1); rec_SL(N+1-k1,k2)=rec_SL(N+1-k1,k2)+p2; end end end %% figure; subplot(2,2,1);imshow(I,[]),title('原始图像'); subplot(2,2,2);imshow(rec,[]),title('直接反投影图像'); subplot(2,2,3);imshow(rec_RL,[]),title('RL滤波反投影图像'); subplot(2,2,4);imshow(rec_SL,[]),title('SL滤波反投影图像');
2)对Shepp-Logan图平行束投影数据进行滤波反投影重建,别采用S-L与R-L滤波器进行滤波
clear; N=256; I=phantom(N); delta=pi/180; theta=0:1:179; theta_num=length(theta); d=1; %%产生投影数据 P=radon(I,theta); [mm,nn]=size(P); e=floor((mm-N-1)/2+1)+1; P=P(e:N+e-1,:); P1=reshape(P,N,theta_num); %% fh_RL=medfuncRlfilterfunction(N,d); fh_SL=medfuncSlfilterfunction(N,d); %% rec=zeros(N); for m=1:theta_num pm=P1(:,m); Cm=(N/2)*(1-cos((m-1)*delta)-sin((m-1)*delta)); for k1=1:N for k2=1:N Xrm=Cm+(k2-1)*cos((m-1)*delta)+(k1-1)*sin((m-1)*delta); n=floor(Xrm); t=Xrm-floor(Xrm); n=max(1,n); n=min(n,N-1); p=(1-t)*pm(n)+t*pm(n+1); rec(N+1-k1,k2)=rec(N+1-k1,k2)+p; end end end %% rec_RL=zeros(N) for m1=1:theta_num pm1=P1(:,m1); pm_RL=conv(fh_RL,pm1,'same'); Cm1=(N/2)*(1-cos((m1-1)*delta)-sin((m1-1)*delta)); for k1=1:N for k2=1:N Xrm1=Cm1+(k2-1)*cos((m1-1)*delta)+(k1-1)*sin((m1-1)*delta); n1=floor(Xrm1); t1=Xrm1-floor(Xrm1); n1=max(1,n1); n1=min(n1,N-1); p1=(1-t1)*pm_RL(n1)+t1*pm_RL(n1+1); rec_RL(N+1-k1,k2)=rec_RL(N+1-k1,k2)+p1; end end end %% rec_SL=zeros(N) for m2=1:theta_num pm2=P1(:,m2); pm_SL=conv(fh_SL,pm2,'same'); Cm2=(N/2)*(1-cos((m2-1)*delta)-sin((m2-1)*delta)); for k1=1:N for k2=1:N Xrm2=Cm2+(k2-1)*cos((m2-1)*delta)+(k1-1)*sin((m2-1)*delta); n2=floor(Xrm2); t2=Xrm2-floor(Xrm2); n2=max(1,n2); n2=min(n2,N-1); p2=(1-t2)*pm_SL(n2)+t2*pm_SL(n2+1); rec_SL(N+1-k1,k2)=rec_SL(N+1-k1,k2)+p2; end end end %% figure; subplot(2,2,1);imshow(I,[]),title('原始图像'); subplot(2,2,2);imshow(rec,[]),title('直接反投影图像'); subplot(2,2,3);imshow(rec_RL,[]),title('RL滤波反投影图像'); subplot(2,2,4);imshow(rec_SL,[]),title('SL滤波反投影图像');
function P = medfuncParallelBeamForwardProjection(theta,N,N_d) shep=[ 1 .69 .92 0 0 0 -.8 .6624 08740 0 -.0184 0 -.2 .1100 .3100 .22 0 -10 -.2 .1600 .4100 -.22 0 15 .1 .2100 .2500 0 .35 5 .1 .0460 .0560 .06 .1 15 .1 .0260 .0460 .13 -.1 20 .1 .0460 .0130 -.08 -.605 -5 .1 .0430 .0230 .03 -.606 3 .1 .0230 .0460 .06 -.605 0]; theta_num = length(theta); P = zeros(N_d,theta_num); % 存放投影数据 rho = shep(:,1).'; % 圆对应密度 be =0.5*N*shep(:,2).'; %椭圆短半轴 ae = 0.5*N*shep(:,3).'; % 椭圆长半轴 xe =0.5*N*shep(:,4).'; %圆中心x坐标 ye = 0.5*N*shep(:,5).'; %圆中心y坐标 alpha = shep(:,6).'; % 圆旋转角度 alpha = alpha * pi/180; theta = theta * pi/180; % 角度换算成弧度 TT =-(N_d-1)/2:(N_d-1)/2;% 探测器坐标 for k1 = 1 : theta_num P_theta = zeros(1,N_d);% 存放每一角度投影数据 for k2 = 1: max(size(xe)) a =(ae(k2) * cos(theta(k1)-alpha(k2)))^2+(be(k2) * sin(theta(k1)-alpha(k2)))^2; temp = a- (TT-xe(k2) * cos(theta(k1))-ye(k2) * sin(theta(k1))).^2; ind = temp>0;% 根号内值需为非负 P_theta(ind)= P_theta(ind) +rho(k2) * (2 * ae(k2) * be(k2) * sqrt(temp(ind)))./a; end P(:,k1) = P_theta.'; end end
function fh_RL=medfuncRlfilterfunction(N,d)
fh_RL=zeros(1,N);
for k1=1:N
fh_RL(k1)=-1/(pi*pi*((k1-N/2-1)*d)^2);
if mod(k1-N/2-1,2)==0
fh_RL(k1)=0;
end
end
fh_RL(N/2+1)=1/(4*d^2);
function fh_SL=medfuncSlfilterfunction(N,d)
fh_PL=zeros(1,N);
for k1=1:N
fh_SL(k1)=-2/(pi^2*d^2*(4*(k1-N/2-1)^2-1));
end
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。