日期:2020-2-9
dudonet的結構如下
第一步要通過線性插值實現去金屬僞影
代碼如下:
clear; clc; close all
%% 建立原始圖像並加入金屬球
Img0=phantom('Modified Shepp-Logan',401);
vec = -200:200;
[xx,yy] = meshgrid(vec,-vec);
x1 = 30;y1 = 50;r1 = 80;
Img0((xx-x1).^2+(yy-y1).^2<=r1) = 2;
R0 = radon(Img0);
srcImg = iradon(R0,0:179);
figure;imshow(srcImg),title('原始圖像');
%% 選定閾值進行分割,選擇閾值爲1.5
[srcImg_width,srcImg_height]=size(srcImg);
%建立2個區域,分別爲:metalImg notMetalImg
metalImg = zeros(srcImg_width,srcImg_height);
notMetalImg = zeros(srcImg_width,srcImg_height);
thrshldVal = 1.5;
for w=1:srcImg_width
for h=1:srcImg_height
if(srcImg(w,h)<thrshldVal)
metalImg(w,h) = 0;
notMetalImg(w,h) = srcImg(w,h);
else
metalImg(w,h) = 255;
notMetalImg(w,h) = 0;
end
end
end
figure;imshow(metalImg);title('金屬的閾值分割圖像');
figure;imshow(notMetalImg);title('非金屬的閾值分割圖像');
%% 投影與反投影
%Radon變換的角度範圍
radon_theta=0:179;
% 金屬的Radon變換
R_metal=radon(metalImg,radon_theta);
figure,imshow(R_metal,[]),title('金屬的Radon變換');
xlabel('\theta');
%非金屬部分的Radon變換
R_notMetal=radon(notMetalImg,radon_theta);
figure,imshow(R_notMetal,[]),title('非金屬部分的Radon變換');
xlabel('\theta');
%% 直接去除金屬部分,會使圖像留下間隙,間隙使用插值算法進行校正
% 對金屬圖像的Radon變換結果進行插值校正
[radon_width,radon_height]=size(R_metal);
%radon變換的結果是橫向座標是距離,縱座標是角度
%metalPQBeta矩陣,存儲金屬的radon變換的邊界
metalPQBeta = zeros(radon_width,radon_height);
%獲取金屬的Radon變換的邊界
for h = 1:radon_height
for w = 2:radon_width-1
preIndex = w -1;
nextIndex = w + 1;
currPix = R_metal(w,h);
if(currPix > 0)
if((R_metal(nextIndex,h) > 0 && R_metal(preIndex,h) == 0) || (R_metal(nextIndex,h) == 0 && R_metal(preIndex,h) > 0))
metalPQBeta(w,h) = 100;
end
end
end
end
% 開始插值,非金屬的radon變換線性插值替換金屬的radon變換
R_LI = R_notMetal;
for h = 1:radon_height
upIndex = 0;
for w = 1:radon_width
if( metalPQBeta(w,h) == 100 && upIndex == 0)
upIndex = w;
elseif(metalPQBeta(w,h) == 100 && upIndex ~= 0)
g_pBeta = R_LI(upIndex,h);
g_qBeta = R_LI(w,h);
midPixValue = R_LI(round((upIndex + w)*0.5),h);
%線性內插
for k = upIndex:w
left_val = g_pBeta*(w - k)/(w - upIndex);
right_val = g_qBeta*(k - upIndex)/(w - upIndex);
R_LI(k,h) = left_val + right_val;
end
end
end
end
figure;imshow(R_LI,[]);title('線性插值後的結果')
%% 逆變換與加金屬
%對新的圖像進行Radon的逆變換,得到圖
%由於圖中此時缺少金屬的信息,因此把原圖中的金屬部分加到圖中
%得到最終的金屬僞影校正圖
%1.對非金屬的radon的變換的插值校正結果進行反變換
NImg=iradon(R_LI,radon_theta);
figure;imshow(NImg,[]);title('插值校正後的圖')
%金屬信息補償
maxValImg = max(max(NImg));
%粘圖
newImg=imresize(NImg,[401,401]);
metalImg=imresize(metalImg,[401,401]);
for w = 1:401
for h = 1:401
if(metalImg(w,h) > 0)
newImg(w,h) = maxValImg;
end
end
end
figure;imshow(newImg,[]);title('final')
插值效果,實際上效果非常有限,金屬僞影依舊是一個非常困難的問題