%======用matlab對圖像進(jìn)行縮放(雙線(xiàn)性插值法)
clear; %此題是用雙線(xiàn)性插值法實(shí)現圖像縮放
I=imread('f.jpg');%讀入原圖像,只需將此處的文件換成要變換的圖片即可
%圖像屬性
% Filename: 'f.jpg'
% FileModDate: '24-Aug-2008 16:50:30'
% FileSize: 20372
% Format: 'jpg'
% FormatVersion: ''
% Width: 480
% Height: 640
% BitDepth: 8
% ColorType:'grayscale'
% FormatSignature: ''
% NumberOfSamples: 1
% CodingMethod: 'Huffman'
% CodingProcess: 'Sequential'
% Comment: {}
[rows,cols]=size(I);
K1 = str2double(inputdlg('請輸入行縮放倍數', 'INPUT scale factor', 1,{'0.5'}));%行默認變?yōu)樵瓉?lái)的0.5倍
K2 = str2double(inputdlg('請輸入列縮放倍數', 'INPUTscale factor', 1, {'0.4'}));%列默認變?yōu)樵瓉?lái)的0.4倍
width = K1 * rows;
height = K2 * cols;
Out = uint8(zeros(width,height)); %創(chuàng )建輸出圖像矩陣
widthScale = rows/width;
heightScale = cols/height;
for x = 6:width - 6 % 6是為了防止矩陣超出邊界溢出
for y = 6:height - 6
oldX = x * widthScale; % oldX,oldY為原坐標,x,y為新坐標
oldY = y * heightScale;
if (oldX/double(uint16(oldX)) == 1.0) &(oldY/double(uint16(oldY)) == 1.0)
Out(x,y) = I(int16(oldX),int16(oldY));%若oldX,oldY為整數,直接賦值
else
a = double(uint16(oldX));
b = double(uint16(oldY));
x11 = double(I(a,b)); % x11 賦值為 I(a,b)
x12 = double(I(a,b+1)); % x12 賦值為 I(a,b+1)
x21 = double(I(a+1,b)); % x21 賦值為 I(a+1,b)
x22 = double(I(a+1,b+1)); % x22 賦值為I(a+1,b+1)
Out(x,y) = uint8( (b+1-oldY) * ((oldX-a)*x21 +(a+1-oldX)*x11) + (oldY-b) * ((oldX-a)*x22 +(a+1-oldX) * x12) ); %用雙線(xiàn)性插值計算公式計算
end
end
end
imshow(I);
figure;
imshow(Out);I=imread('f.jpg');%讀入圖像
%圖像屬性
% Filename: 'f.jpg'
% FileModDate: '24-Aug-2008 16:50:30'
% FileSize: 20372
% Format: 'jpg'
% FormatVersion:''
% Width: 480
% Height: 640
% BitDepth: 8
% ColorType: 'grayscale'
% FormatSignature: ''
% NumberOfSamples: 1
% CodingMethod:'Huffman'
% CodingProcess: 'Sequential'
% Comment:{}
[rows,cols]=size(I);
K1 = str2double(inputdlg('請輸入行縮放倍數', 'INPUT scale factor', 1,{'0.6'}));%行默認變?yōu)樵瓉?lái)的0.6倍
K2 = str2double(inputdlg('請輸入列縮放倍數', 'INPUTscale factor', 1, {'0.4'}));%列默認變?yōu)樵瓉?lái)的0.4倍
width = K1 * rows;
height = K2 * cols;
im2 = uint8(zeros(width,height)); %定義輸出圖像矩陣
widthScale = rows/width;
heightScale = cols/height;
for x = 6:width - 6 %為防止矩陣溢出而選擇的參數6
for y = 6:height - 6
oldX = x * widthScale; %oldX,oldY為原坐標,x,y為新坐標
oldY = y * heightScale;
if (oldX/double(uint16(oldX)) == 1.0) &(oldY/double(uint16(oldY)) == 1.0)
im2(x,y) = I(int16(oldX),int16(oldY));
else
a = double(round(oldX));
b = double(round(oldY)); %若不是整數四舍五入后把臨近值賦過(guò)去
im2(x,y) = I(a,b);
end
end
end
imshow(I); %輸出原圖像
figure;
imshow(im2); %輸出縮放后圖像
%====================用matlab對圖像進(jìn)行旋轉(雙線(xiàn)性插值法)
clear;%此題是用最近鄰域法實(shí)現圖像旋轉
im1=imread('b.jpg');
[m,n,p]=size(im1);
%將圖像旋轉30度
a=0.5; %a=sin30=0.5
b=0.866; %b=cos30=0.866
row=n*a+m*b;
col=n*b+m*a;
fori=1:row %先把圖象填充成全黑
for j=1:col
im2(i,j,:)=uint8(0);
end
end
for i=1:m %把原圖象像素點(diǎn)旋轉后變?yōu)樾聢D象點(diǎn)
for j=1:n
xx=round(abs((i-m/2)*b-(j-n/2)*a+row/2));
yy=round(abs((i-m/2)*a+(j-n/2)*b+col/2));
for k=1:3
im2(xx,yy,k)=im1(i,j,k);
end
end
end
temp1=uint8(0);
temp2=uint8(0);
temp3=uint8(0);
for i=1:row %把畫(huà)面上的空點(diǎn)按照最近鄰插值法填充
temp1=uint8(0);
temp2=uint8(0);
temp3=uint8(0);
for j=1:col %找到最右的圖象邊界點(diǎn)
if(im2(i,j,:)==uint8(0))
else
kk=j;
end
end
for j=1:kk
if (im2(i,j,:)==uint8(0))
im2(i,j,1)=temp1;
im2(i,j,2)=temp2;
im2(i,j,3)=temp3;
else
temp1=im2(i,j,1);
temp2=im2(i,j,2);
temp3=im2(i,j,3);
end
end
end
imshow(im1);
figure;
imwrite(im1,'5.jpg');%保存原圖像
imshow(im2);
imwrite(im2,'6.jpg');%保存旋轉后圖像
%======================用matlab對圖片進(jìn)行旋轉(最近鄰域法)
clear;%此題是用最近鄰域法實(shí)現圖像旋轉
im1=imread('b.jpg');
[m,n,p]=size(im1);
%將圖像旋轉30度
a=0.5; %a=sin30=0.5
b=0.866; %b=cos30=0.866
row=n*a+m*b;
col=n*b+m*a;
fori=1:row %先把圖象填充成全黑
for j=1:col
im2(i,j,:)=uint8(0);
end
end
for i=1:m %把原圖象像素點(diǎn)旋轉后變?yōu)樾聢D象點(diǎn)
for j=1:n
xx=round(abs((i-m/2)*b-(j-n/2)*a+row/2));
yy=round(abs((i-m/2)*a+(j-n/2)*b+col/2));
for k=1:3
im2(xx,yy,k)=im1(i,j,k);
end
end
end
temp1=uint8(0);
temp2=uint8(0);
temp3=uint8(0);
for i=1:row %把畫(huà)面上的空點(diǎn)按照最近鄰插值法填充
temp1=uint8(0);
temp2=uint8(0);
temp3=uint8(0);
for j=1:col %找到最右的圖象邊界點(diǎn)
if(im2(i,j,:)==uint8(0))
else
kk=j;
end
end
for j=1:kk
if (im2(i,j,:)==uint8(0))
im2(i,j,1)=temp1;
im2(i,j,2)=temp2;
im2(i,j,3)=temp3;
else
temp1=im2(i,j,1);
temp2=im2(i,j,2);
temp3=im2(i,j,3);
end
end
end
imshow(im1);
figure;
imwrite(im1,'5.jpg');%保存原圖像
imshow(im2);
imwrite(im2,'6.jpg');%保存旋轉后圖像
聯(lián)系客服