17国赛——CT成像问题

题目背景

17国赛——CT成像问题_第1张图片

求解过程 

第一问

clear;clc

%% 数据读入与绘图
data1 = xlsread('A题附件.xls','附件1'); %读入表1数据
data2 = xlsread('A题附件.xls','附件2'); %读入表2数据
figure(1); %创建画布1
imshow(data1,[]); %绘制数据1的灰度图像
figure(2); %创建画布2
imagesc(data1); %绘制数据2的彩色图像
figure(3); %创建画布3
imshow(data2,[]); %绘制数据2的灰度图像
figure(4); %创建画布4
imagesc(data2); %绘制数据2的彩色图像

%% 180个方向、探测器单元间距和旋转中心的计算
radio_max = max(max(data2)); %max(X)只能返回每一列的最大值组成的序列。
[radio_max_figure,radio_max_index] = find(radio_max == data2); %找出最大值所在的行和列。
cover_max = 0;  %记录探测器利用个数最大的信息组
cover_max_index = 0; %记录探测器利用个数最大的信息组的标号
cover_cnt = []; %记录每个信息组探测器的使用个数
for i=1:180
    count = 0;  %初始化计数变量
    for j= 1:512
        if data2(j,i) > 0 
            count = count + 1;  %记录探测器利用个数
        end
    end
    if count >= cover_max
        cover_max = count;  %更新探测器利用个数最大的信息组
        cover_max_index = i;  %更新探测器利用个数最大的信息组的标号
    end
    cover_cnt = [cover_cnt,count]; %记录各组信息中探测器的利用个数
end
cover_max_index = cover_max_index - 4;
maxfigure = max(data2(:,cover_max_index)); %找出探测器利用个数最大信息组中信息最大值
cover_max_maxfigure = find(maxfigure == data2(:,cover_max_index)); 
%记录找出探测器利用个数最大信息组中信息最大值标号
per_length = 80/(cover_max - 1); %记录探测器单元之间的距离
center_x = per_length * abs(radio_max_figure - 256.5);  %记录旋转中心横坐标
center_y = per_length * abs(cover_max_maxfigure - 256.5); %记录旋转中心纵坐标
rotate_center = [center_x, center_y]; %输出旋转中心坐标
per_angle = (radio_max_index - cover_max_index)/90; %计算信息变换一次的旋转角度
initial_angle = 90 - (cover_max_index - 1) * per_angle; %算出初始角度
angle = [initial_angle]; %记录变换角度的数组
iter_angle = initial_angle; %初始化迭代角度
for k= 1:179
    iter_angle = iter_angle + per_angle;
    angle = [angle,iter_angle];    %计算变化角度,存放在数组中
end




第二问

clear;clc

%% 数据读入
data1 = xlsread('A题附件.xls','附件1'); %读入表1数据
data2 = xlsread('A题附件.xls','附件2'); %读入表2数据
data3 = xlsread('A题附件.xls','附件3'); %读入表3数据
width = length(data2); %记录行数,滤波器计算有用

%% 通过表一和表二的数据来求出增益系数
figure,imshow(data2,[]),title('滤波前的CT投影信号');% 展示滤波处理前的CT投影信号
filter=2*[0:round(width/2-1), width/2:-1:1]'/width; % 设计R-L滤波器
r_fft=fft(data2,512); % 每一列做傅里叶变换,第一个参数为矩阵就按列处理,第二个参数为其长度
r_fft_filter=r_fft.*filter; % 每一列做傅里叶变换后滤波
r_fft_filter_v=real(ifft(r_fft_filter));% 滤波后反变换(real取实部)
figure,imshow(r_fft_filter_v,[]),title('滤波后的CT投影信号'); %展示滤波处理后的CT投影信号
Backinf =iradon(r_fft_filter_v,30:209,'linear','none',512); 
%第一个参数为投影矩阵,第二个参数为各组信息的角度,第三个参数为差值方法,第五个参数为向量长度,重建信息矩阵
figure,hold on,imagesc([-width/2+0.5 width/2-0.5],[width/2-0.5 -width/2+0.5],Backinf); % 绘制滤波反投影图像
plot(0,0,'.r') %标出原点所在位置
x=9.0278;y=-5.6944;d=0.2778; % 椭圆几何中心坐标及探测器单元之间的距离
plot(([-50 50 50 -50 -50]+x)/d,([-50 -50 50 50 -50]+y)/d,'r');% 在图中标出题中所给模板的区域,建立像素矩阵
Inf_wanted=Backinf(96:456,108:468); % 从矩阵中提取出模板图像的像素矩阵,100/d约为360,故有360格,361个数据。
Inf_wanted(Inf_wanted<0)=0;  %负吸收率没有意义,作为0处理
k = mean(data1,'all')/mean(Inf_wanted,'all');  %通过data1和data2的重建吸收率数据求出增益系数k

%% 重建表三的图像并求出表中所给点的吸收率
figure,imshow(data3,[]),title('滤波前的CT投影信号');% 展示滤波处理前的CT投影信号
filter=2*[0:round(width/2-1), width/2:-1:1]'/width; % 设计R-L滤波器
r_fft=fft(data3,512); % 每一列做傅里叶变换,第一个参数为矩阵就按列处理,第二个参数为其长度
r_fft_filter=r_fft.*filter; % 每一列做傅里叶变换后滤波
r_fft_filter_v=real(ifft(r_fft_filter));% 滤波后反变换(real取实部)
figure,imshow(r_fft_filter_v,[]),title('滤波后的CT投影信号'); %展示滤波处理后的CT投影信号
Backinf3 =iradon(r_fft_filter_v,30:209,'linear','none',512); 
%第一个参数为投影矩阵,第二个参数为各组信息的角度,第三个参数为差值方法,第五个参数为向量长度,重建信息矩阵
figure,hold on,imagesc([-width/2+0.5 width/2-0.5],[width/2-0.5 -width/2+0.5],Backinf3); % 绘制滤波反投影图像
plot(0,0,'.r') %标出原点所在位置
x=9.0278;y=-5.6944;d=0.2778; % 椭圆几何中心坐标及探测器单元之间的距离
plot(([-50 50 50 -50 -50]+x)/d,([-50 -50 50 50 -50]+y)/d,'r');% 在图中标出题中所给模板的区域,建立像素矩阵
Inf_wanted3 = Backinf3(96:456,108:468); % 从矩阵中提取出模板图像的像素矩阵,100/d约为360,故有360格,361个数据。
Inf_wanted3(Inf_wanted3<0) = 0; %对iradon得到的矩阵进行处理,令小于0的无意义的吸收率值为0
Inf_wanted3 = Inf_wanted3 .* 2.1314; %输出增益后的吸收率信息
figure,imshow(Inf_wanted3,[]); %绘制出表三的重建图像
figure,imagesc(Inf_wanted3); %绘值重建图彩色图像

%% 计算10个坐标的吸收率
compact_module = imresize(Inf_wanted3,256/361); %将图像压缩成256*256的矩阵
imshow(compact_module,[]); %展示压缩后的图像
radio_rate = [];  %存放吸收率数值
per_unit = 100/255; %单个像素的长度
data4 = xlsread('A题附件.xls','附件4'); %读入data4数据
x_position = data4(:,1); %记录x坐标
y_position = data4(:,2); %记录y坐标
%建立像素矩阵时候,已经没有了原点的概念,第一个元素为左上角的那个元素。纵坐标对应行,写前面。
for i = 1:10
    x_position(i) = round(x_position(i)/per_unit+1); %计算256*256像素矩阵下横坐标
    y_position(i) = 256 - round(y_position(i)/per_unit); %计算256*256像素矩阵下纵坐标
    radio_rate = [radio_rate;compact_module(y_position(i),x_position(i))]; %将10个坐标吸收率写入表格
end


第三问

clear;clc

%% 数据读入
data1 = xlsread('A题附件.xls','附件1'); %读入表1数据
data2 = xlsread('A题附件.xls','附件2'); %读入表2数据
data3 = xlsread('A题附件.xls','附件5'); %读入表3数据
width = length(data2); %记录行数,滤波器计算有用

%% 通过表一和表二的数据来求出增益系数
figure,imshow(data2,[]),title('滤波前的CT投影信号');% 展示滤波处理前的CT投影信号
filter=2*[0:round(width/2-1), width/2:-1:1]'/width; % 设计R-L滤波器
r_fft=fft(data2,512); % 每一列做傅里叶变换,第一个参数为矩阵就按列处理,第二个参数为其长度
r_fft_filter=r_fft.*filter; % 每一列做傅里叶变换后滤波
r_fft_filter_v=real(ifft(r_fft_filter));% 滤波后反变换(real取实部)
figure,imshow(r_fft_filter_v,[]),title('滤波后的CT投影信号'); %展示滤波处理后的CT投影信号
Backinf =iradon(r_fft_filter_v,30:209,'linear','none',512); 
%第一个参数为投影矩阵,第二个参数为各组信息的角度,第三个参数为差值方法,第五个参数为向量长度,重建信息矩阵
figure,hold on,imagesc([-width/2+0.5 width/2-0.5],[width/2-0.5 -width/2+0.5],Backinf); % 绘制滤波反投影图像
plot(0,0,'.r') %标出原点所在位置
x=9.0278;y=-5.6944;d=0.2778; % 椭圆几何中心坐标及探测器单元之间的距离
plot(([-50 50 50 -50 -50]+x)/d,([-50 -50 50 50 -50]+y)/d,'r');% 在图中标出题中所给模板的区域,建立像素矩阵
Inf_wanted=Backinf(96:456,108:468); % 从矩阵中提取出模板图像的像素矩阵,100/d约为360,故有360格,361个数据。
Inf_wanted(Inf_wanted<0)=0;  %负吸收率没有意义,作为0处理
k = mean(data1,'all')/mean(Inf_wanted,'all');  %通过data1和data2的重建吸收率数据求出增益系数k

%% 重建表三的图像并求出表中所给点的吸收率
filter=2*[0:round(width/2-1), width/2:-1:1]'/width; % 设计R-L滤波器
r_fft=fft(data3,512); % 每一列做傅里叶变换,第一个参数为矩阵就按列处理,第二个参数为其长度
r_fft_filter=r_fft.*filter; % 每一列做傅里叶变换后滤波
r_fft_filter_v=real(ifft(r_fft_filter));% 滤波后反变换(real取实部)
% figure,imshow(r_fft_filter_v,[]),title('滤波后的CT投影信号'); %展示滤波处理后的CT投影信号
Backinf3 =iradon(r_fft_filter_v,30:209,'linear','none',512); 
%第一个参数为投影矩阵,第二个参数为各组信息的角度,第三个参数为差值方法,第五个参数为向量长度,重建信息矩阵
figure,hold on,imagesc([-width/2+0.5 width/2-0.5],[width/2-0.5 -width/2+0.5],Backinf3); % 绘制滤波反投影图像
plot(0,0,'.r') %标出原点所在位置
x=9.0278;y=-5.6944;d=0.2778; % 椭圆几何中心坐标及探测器单元之间的距离
plot(([-50 50 50 -50 -50]+x)/d,([-50 -50 50 50 -50]+y)/d,'r');% 在图中标出题中所给模板的区域,建立像素矩阵
Inf_wanted3 = Backinf3(96:456,108:468); % 从矩阵中提取出模板图像的像素矩阵,100/d约为360,故有360格,361个数据。
Inf_wanted3(Inf_wanted3<0) = 0; %对iradon得到的矩阵进行处理,令小于0的无意义的吸收率值为0
Inf_wanted3 = Inf_wanted3 .* k; %输出增益后的吸收率信息
figure,imshow(Inf_wanted3,[]); %绘制出表三的重建图像
figure,imagesc(Inf_wanted3); %绘值重建图彩色图像

%% 计算10个坐标的吸收率
compact_module = imresize(Inf_wanted3,256/361); %将图像压缩成256*256的矩阵
imshow(compact_module,[]); %展示压缩后的图像
radio_rate = [];  %存放吸收率数值
per_unit = 100/255; %单个像素的长度
data4 = xlsread('A题附件.xls','附件4'); %读入data4数据
x_position = data4(:,1); %记录x坐标
y_position = data4(:,2); %记录y坐标
%建立像素矩阵时候,已经没有了原点的概念,第一个元素为左上角的那个元素。纵坐标对应行,写前面。
for i = 1:10
    x_trapos = round(x_position(i)/per_unit+1); %计算256*256像素矩阵下横坐标
    y_trapos = 256 - round(y_position(i)/per_unit); %计算256*256像素矩阵下纵坐标
    radio_rate = [radio_rate;compact_module(y_trapos,x_trapos)]; %将10个坐标吸收率写入表格
end

第四问

clear;clc

%% 粒子群数据初始化
n = 100; % 粒子数量
narvs = 4; % 变量个数
c1 = 2.05;  % 每个粒子的个体学习因子,也称为个体加速常数
c2 = 2.05;  % 每个粒子的社会学习因子,也称为社会加速常数
C = c1+c2;  
fai = 2/abs((2-C-sqrt(C^2-4*C))); % 收缩因子
w = 0.9;  % 惯性权重 
K = 50;  % 迭代的次数
vmax = [1 1 1 1]; % 粒子的最大速度
x_lb = [0 1 0 10]; % x的下界
x_ub = [50 10 5 20]; % x的上界

%% 初始化粒子的位置和速度
x = zeros(n,narvs);
for i = 1: narvs
    x(:,i) = x_lb(i) + (x_ub(i)-x_lb(i))*rand(n,1);    % 随机初始化粒子所在的位置在定义域内
end
v = -vmax + 2*vmax .* rand(n,narvs);  % 随机初始化粒子的速度(这里我们设置为[-vmax,vmax])

%% 计算适应度
fit = zeros(n,1);  % 初始化这n个粒子的适应度全为0
for i = 1:n  % 循环整个粒子群,计算每一个粒子的适应度
    fit(i) = Obj_fun2(x(i,:));   % 调用Obj_fun2函数来计算适应度
end 
pbest = x;   % 初始化这n个粒子迄今为止找到的最佳位置(是一个n*narvs的向量)
ind = find(fit == min(fit), 1);  % 找到适应度最小的那个粒子的下标
gbest = x(ind,:);  % 定义所有粒子迄今为止找到的最佳位置(是一个1*narvs的向量)

%% 在图上标上这n个粒子的位置用于演示
h = scatter3(x(:,1),x(:,2),fit,'*r');  % scatter3是绘制三维散点图的函数(这里返回h是为了得到图形的句柄,未来我们对其位置进行更新)

%% 迭代K次来更新速度与位置
fitnessbest = ones(K,1);  % 初始化每次迭代得到的最佳的适应度
for d = 1:K  % 开始迭代,一共迭代K次
    for i = 1:n   % 依次更新第i个粒子的速度与位置
        v(i,:) = fai * (w*v(i,:) + c1*rand(1)*(pbest(i,:) - x(i,:)) + c2*rand(1)*(gbest - x(i,:)));  % 更新第i个粒子的速度
        %  有时候会看到直接写成:0.657*v(i,:) +  1.496*rand(1)*(pbest(i,:) - x(i,:)) + 1.496*rand(1)*(gbest - x(i,:)));
        x(i,:) = x(i,:) + v(i,:); % 更新第i个粒子的位置
        % 如果粒子的位置超出了定义域,就对其进行调整
        for j = 1: narvs
            if x(i,j) < x_lb(j)
                x(i,j) = x_lb(j);
            elseif x(i,j) > x_ub(j)
                x(i,j) = x_ub(j);
            end
        end
        fit(i) = Obj_fun2(x(i,:));  % 重新计算第i个粒子的适应度
        if fit(i) < Obj_fun2(pbest(i,:))   % 如果第i个粒子的适应度小于这个粒子迄今为止找到的最佳位置对应的适应度
           pbest(i,:) = x(i,:);   % 那就更新第i个粒子迄今为止找到的最佳位置
        end
        if  fit(i) < Obj_fun2(gbest)  % 如果第i个粒子的适应度小于所有的粒子迄今为止找到的最佳位置对应的适应度
            gbest = pbest(i,:);   % 那就更新所有粒子迄今为止找到的最佳位置
        end
    end
    fitnessbest(d) = Obj_fun2(gbest);  % 更新第d次迭代得到的最佳的适应度
    pause(0.1)  % 暂停0.1s
    h.XData = x(:,1);  % 更新散点图句柄的x轴的数据(此时粒子的位置在图上发生了变化)
    h.YData = x(:,2);   % 更新散点图句柄的y轴的数据(此时粒子的位置在图上发生了变化)
    h.ZData = fit;  % 更新散点图句柄的z轴的数据(此时粒子的位置在图上发生了变化)
end

figure(2) 
plot(fitnessbest)  % 绘制出每次迭代最佳适应度的变化图
xlabel('迭代次数');
disp('最佳的位置是:'); disp(gbest)
disp('此时最优值是:'); disp(Obj_fun2(gbest))

你可能感兴趣的:(matlab,视觉检测)