1. 程式人生 > >數字影象處理 第二章

數字影象處理 第二章

旋轉

i=imread('cs.jpg');
i=rgb2gray(i);
b=imrotate(i,30,'nearest');
c=imrotate(i,50,'bilinear');
d=imrotate(i,80,'bicubic');
subplot(2,2,1),imshow(i);
title('原影象');
subplot(1,3,1),imshow(b);
title('最鄰近差值');
subplot(1,3,2),imshow(c);
title('雙線性差值');
subplot(1,3,3);imshow(d);
title('雙三次差值');

雙線性插值

%%雙線性插值實現
original=imread('cs.jpg');
[height,width,channel] = size(original); 
zmf=0.5;
new_height = round(height*zmf); % 計算縮放後的影象高度,最近取整 
new_width = round(width*zmf); % 計算縮放後的影象寬度,最近取整
new_img = zeros(new_height,new_width,channel); % 建立新影象 
img_scale = zeros(height+2,width+2,channel); % 為了邊界點考慮的
img_scale(2:height+1,2:width+1,:) = original;
img_scale(1,2:width+1,:) = original(1,:,:); 
img_scale(height+2,2:width+1,:) = original(height,:,:); 
img_scale(2:height+1,1,:) = original(:,1,:);
img_scale(2:height+1,width+2,:) = original(:,width,:);
img_scale(1,1,:) = original(1,1,:); 
img_scale(1,width+2,:) = original(1,width,:);
img_scale(height+2,1,:) = original(height,1,:); 
img_scale(height+2,width+2,:) = original(height,width,:);
for zj = 1:new_width % 對影象進行按列逐元素掃描 
    for zi = 1:new_height % (zi,zj)表示在新圖中的座標,(ii,jj)表示在原圖中的座標 % 注意:(ii,jj)不一定是整數 
        ii = (zi-1)/zmf; jj = (zj-1)/zmf; 
        i = floor(ii); j = floor(jj); % 向下取整得到在原圖中座標的整數部分
        u = ii - i; v = jj - j; % 得到在原圖中座標的小數部分 
        i = i + 1; 
        j = j + 1; 
        new_img(zi,zj,:) = (1-u)*(1-v)*img_scale(i,j,:) + u*(1-v)*img_scale(i,j+1,:)... 
            + (1-u)*v*img_scale(i+1,j,:) + u*v*img_scale(i+1,j+1,:); 
    end 
end
new_img = uint8(new_img);
subplot 121 ,imshow(original);
subplot 122,imshow(new_img);

 


%雙線性插值
function scaler_bilinear_matlab()
%配置輸入輸出
I=imread('E:\哈利.jpg');
[width_sr,height_sr,L]=size(I);
K=str2double(inputdlg('please input scale factor (must between 0.2 - 5.0)','INPUT scale factor',1,{'0.5'}));
width =K*width_sr;
height=K*height_sr;
O = uint8(zeros(floor(width),floor(height),L));%size 必須為整數
widthscale=width_sr/width;
heightscale=height_sr/height;

for x=5:width-5
    for y=5:height-5
        xx=x*widthscale;
        yy=y*heightscale;
        
        if(xx/double(uint16(xx)==1.0))&(yy/double(uint16(yy)==1.0))
            O(x,y,:)=I(int16(xx),int16(yy));
        else
            a=double(uint16(xx));
            b=double(uint16(yy));
            x11=double(I(a,b,:));
            x12=double(I(a,b+1,:));
            x21=double(I(a+1,b,:));
            x22=double(I(a+1,b+1,:));
            
            O(x,y,:)=uint8((b+1-yy)*(xx-a)*x21+(a+1-xx)*x11+(yy-b)*((xx-a)*x22+(a+1-xx)*x12));%雙線性插值計算公式
        end
    end
end
figure,imshow(I);title('輸入影象')
figure,imshow(uint8(O));title('輸出影象')
            

仿射變換

%%仿射變換
A = imread('lena.jpg');
[height,width,dim] = size(A);
tform = maketform('affine',[-1 0 0;0 1 0;width 0 1]);
B = imtransform(A,tform,'nearest');
tform2 = maketform('affine',[1 0 0;0 -1 0;0 height 1]);
C = imtransform(A,tform2,'nearest');
figure;
subplot(1,3,1),imshow(A);title('原影象');
subplot(1,3,2),imshow(B);title('lena水平映象');
subplot(1,3,3),imshow(C);title('lena垂直映象');

tform = maketform('affine',[0 1 0;1 0 0;0 0 1]);
B = imtransform(A,tform,'nearest');
figure;
subplot(1,2,1),imshow(A);title('原影象');
subplot(1,2,2),imshow(B);title('轉置後圖像');

B = imrotate(A,30,'nearest','crop');
figure;
subplot(1,2,1),imshow(A);title('原影象');
subplot(1,2,2),imshow(B);title('逆時針中心旋轉30度');



%%第二章亮度變換與空間濾波

%%gamma變換

f = imread('lena.jpg');

figure;          %開啟新視窗
subplot 221;imshow(f);title('lena');
subplot 222;imshow(imadjust(f,[],[],0.5));title('Gamma 0.5');
subplot 223;imshow(imadjust(f,[],[],1.5));title('Gamma 1.5');
subplot 224;imshow(imadjust(f,[],[],3));title('Gamma 3');

%%對數變換,壓縮亮,增強暗部

f = imread('直方圖.gif');
F = fft2(im2double(f));
F = fftshift(F);   %FFT頻譜平移
F = abs(F);
T = 2*log(F+1);      %頻譜對數變換
figure,subplot 121 ;imshow(F,[]);title('未經變換的頻譜');
subplot 122;imshow(T,[]);title('對數變換後');

%%直方圖均衡化
g = histeq(f,255);  %f為輸入影象 nlev是為輸入影象指定的灰度級數
[M,N] = size(f);           
[counts1,x1] = imhist(f,32); %計算有32個小區間的灰度直方圖
counts1 = counts1/M/N;       %計算歸一化灰度直方圖各區間的值
[M,N] = size(g);           
[counts2,x2] = imhist(g,32); %計算有32個小區間的灰度直方圖
counts2 = counts2/M/N;       %計算歸一化灰度直方圖各區間的值
figure;subplot 221,imshow(f);title('原圖');
subplot 222 ;stem(x1,counts1); title('原圖直方圖')           %繪製歸一化直方圖
subplot 223,imshow(g);title('均衡化圖');
subplot 224 ;stem(x2,counts2); title('均衡化直方圖') ;

%%影象平移

se = translate(strel(f),[180 190]);%strel用來建立形態學結構元素 ,【180 190】分別表示結構元素y,x方向平移
B = imdilate(f,se);
figure;subplot(1,2,1),subimage(f);title('原影象');
subplot(1,2,2),subimage(B);title('平移後圖像');






%%噪聲濾波

A = imread('lena.jpg');
B = imnoise(A,'gaussian',0,0.02);%imnoise(f,'gaussian',m,var)中的方差是實際方差除以灰度級的平方,所以如果標準差25,var=25^2/255^2=0.0096
C = imnoise(A,'salt & pepper',0.02);
figure;
subplot(1,3,1),imshow(A);title('原影象');
subplot(1,3,2),imshow(B);title('新增高斯白噪聲');
subplot(1,3,3),imshow(C);title('新增椒鹽白噪聲');

%%影象銳化

I=double(A);%雙精度化
w1=[-1 0;0 1];
w2=[0 -1;1 0];
G1=imfilter(I,w1,'corr','replicate');%正45°梯度
G2=imfilter(I,w2,'corr','replicate');%負45°梯度
G=abs(G1)+abs(G2);%計算Robert梯度
figure;
subplot(1,3,1),imshow(G,[]);title('Robert梯度');
subplot(1,3,2),imshow(abs(G1),[]);title('正45°梯度');
subplot(1,3,3),imshow(abs(G2),[]);title('負45°梯度');


Id=double(I);%雙精度化
h_1=fspecial('log',5,0.5);%大小為5,sigma=0.5的LOG運算元
I_1=imfilter(Id,h_1,'corr','replicate');
h_2=fspecial('log',5,2);%大小為5,sigma=2的LOG運算元
I_2=imfilter(Id,h_2,'corr','replicate');
figure;
subplot(1,2,1),imshow(uint8(abs(I_1)),[]);title('大小為5,sigma=0.5的LOG運算元');
subplot(1,2,2),imshow(uint8(abs(I_2)),[]);title('大小為5,sigma=2的LOG運算元');