1. 程式人生 > >【影象處理知識複習】08影象旋轉後空洞問題處理 Matlab

【影象處理知識複習】08影象旋轉後空洞問題處理 Matlab

演算法

遍歷旋轉後圖像,判斷當前點是否為空穴(四近鄰畫素值都大於0,且當前點等於0)。鄰近插值法,則左邊畫素替代當前0畫素,如果均值插值,則取四近鄰均值。

效果如下:


1. Matlab程式碼如下:

%題目:影象的旋轉,(1)鄰近插值法,(2)均值插值,處理空穴。
%旋轉公式;I = icost-jsint; J = isint+jcost。旋轉角度t給定。

%這裡空穴,指的是當前0畫素的四近鄰畫素值都大於零,當前畫素就是空穴。

f = imread('D:/Code/Image/classic.jpg');
f = rgb2gray(f);
figure,imshow(f);
[row,col] = size(f);
A = zeros(row,col);%儲存的是行號
B = zeros(row,col);%儲存的是列號
%1, 旋轉後的行、列號
for i=1:row
   for j=1:col
        A(i,j) = round( i*cosd(30)-j*sind(30) );%旋轉後的行號矩陣
   end
end
for i=1:row
   for j=1:col
        B(i,j) = round( i*sind(30)+j*cosd(30) );%旋轉後的列號矩陣
   end
end
%2, 使行列號值為正整數
for i=1:row
    for j=1:col
        if ( 1-A(i,j) ) >0
            plusi = 1-A(i,j);
            A = A+plusi;%使儲存的行號值為正整數
        end
        if ( 1-B(i,j) ) >0
            B = B+plusj;%使儲存的列號值為正整數
        end
    end
end
%3,定義新的畫布,並遍歷舊畫布,填充到新畫布中
maxi = max(max(A)); %最大行號
maxj = max(max(B)); %最大列號
G = zeros(maxi,maxj);%擴大後的畫布,儲存的值為灰度值
for i=1:row
   for j=1:col
        G(A(i,j),B(i,j)) = f(i,j);%畫素值填充
   end
end
figure,
imshow(uint8(G));%顯示旋轉後圖像

%(1) 鄰近插值
for i=2:maxi-1 for j=2:maxj-1 if G(i,j)==0 && G(i-1,j)>0 && G(i-1,j-1)>0 && G(i,j+1)>0 && G(i+1,j)>0 % 判斷當前點是否為空穴點 G(i,j) = G(i,j-1); end end end figure,imshow(uint8(G)); %(2)均值插值 for i=2:maxi-1 for j=2:maxj-1 if G(i,j)==0 && G(i-1,j)>0 && G(i-1,j-1)>0 && G(i,j+1)>0 && G(i+1,j)>0 G(i,j) = (G(i-1,j) + G(i-1,j-1) + G(i,j+1) + G(i+1,j))/4; end end end figure,imshow(uint8(G));