線性插值方法去僞影

日期: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')

插值效果,實際上效果非常有限,金屬僞影依舊是一個非常困難的問題
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章