?? linear.m
字號:
% 雙線性插值與最近鄰域插值的圖像放大
% Copyright by luoyuanhong: 2009-3-27
% 讀圖
[filename, pathname, filterindex] = uigetfile('*.bmp;*.jpg','打開圖像!');
RGB = imread(filename);
R = RGB(:,:,1);
G = RGB(:,:,2);
B = RGB(:,:,3);
[nrows,ncols,ncoms]=size(RGB);
% 放大的尺度,從1到9
K = str2double(inputdlg('please input scale factor (must between 1.0 - 8.0)', 'INPUT scale factor', 1, {'2.0'}));
if (K < 1.0) | (K > 9.0)
errordlg('scale factor beyond permitted range(1.0 - 8.0)', 'ERROR');
error('please input scale factor (must between 1.0 - 8.0)');
end
% 原圖
figure,imshow(RGB),title('原圖');
% 輸出圖像的尺寸
width = K * ncols;
height = K * nrows;
RR = uint8(zeros(height,width));
GG = uint8(zeros(height,width));
BB = uint8(zeros(height,width));
OUT = uint8(zeros(height,width,ncoms));
RR2 = uint8(zeros(height,width));
GG2 = uint8(zeros(height,width));
BB2 = uint8(zeros(height,width));
OUT2 = uint8(zeros(height,width,ncoms));
widthScale = 1/K;
heightScale = 1/K;
% 雙線性插值
for x = K:width-K
for y = K:height-K
xx = x * widthScale;
yy = y * heightScale;
if (xx <= 1.0e-8)
xx = 1;
end
if (xx > ncols - 1)
xx = ncols - 1;
end
if (yy <= 1.0e-8)
yy = 1;
end
if (yy > nrows - 1)
yy = nrows - 1;
end
if (xx/double(uint16(xx)) == 1.0) && (yy/double(uint16(yy)) == 1.0) % 放大后的象素坐標為整數
RR(y,x) = R(int16(yy),int16(xx));
GG(y,x) = G(int16(yy),int16(xx));
BB(y,x) = B(int16(yy),int16(xx));
else % 放大后的象素坐標不為整數
a = double(fix(yy));
b = double(fix(xx));
r11 = double(R(a,b));
r12 = double(R(a,b+1));
r21 = double(R(a+1,b));
r22 = double(R(a+1,b+1));
RR(y,x) = uint8( (b+1-xx) * ((yy-a)*r21 + (a+1-yy)*r11) + (xx-b) * ((yy-a)*r22 +(a+1-yy) * r12) );
g11 = double(G(a,b));
g12 = double(G(a,b+1));
g21 = double(G(a+1,b));
g22 = double(G(a+1,b+1));
GG(y,x) = uint8( (b+1-xx) * ((yy-a)*g21 + (a+1-yy)*g11) + (xx-b) * ((yy-a)*g22 +(a+1-yy) * g12) );
b11 = double(B(a,b));
b12 = double(B(a,b+1));
b21 = double(B(a+1,b));
b22 = double(B(a+1,b+1));
BB(y,x) = uint8( (b+1-xx) * ((yy-a)*b21 + (a+1-yy)*b11) + (xx-b) * ((yy-a)*b22 +(a+1-yy) * b12) );
end
end
end
% 最近鄰域插值
for x = K:width-K
for y = K:height-K
xx = x * widthScale;
yy = y * heightScale;
if (xx <= 1.0e-8)
xx = 1;
end
if (xx > ncols - 1)
xx = ncols - 1;
end
if (yy <= 1.0e-8)
yy = 1;
end
if (yy > nrows - 1)
yy = nrows - 1;
end
if (xx/double(uint16(xx)) == 1.0) && (yy/double(uint16(yy)) == 1.0) % 放大后的象素坐標為整數
RR2(y,x) = R(int16(yy),int16(xx));
GG2(y,x) = G(int16(yy),int16(xx));
BB2(y,x) = B(int16(yy),int16(xx));
else % 放大后的象素坐標不為整數
a = double(fix(yy));
b = double(fix(xx));
xl = x-a;
yl = y-b;
r11 = double(R(a,b));
r12 = double(R(a,b+1));
r21 = double(R(a+1,b));
r22 = double(R(a+1,b+1));
g11 = double(G(a,b));
g12 = double(G(a,b+1));
g21 = double(G(a+1,b));
g22 = double(G(a+1,b+1));
b11 = double(B(a,b));
b12 = double(B(a,b+1));
b21 = double(B(a+1,b));
b22 = double(B(a+1,b+1));
if(xl<=0.5 && yl<=0.5)
RR2(y,x) = uint8(r11);
GG2(y,x) = uint8(g11);
BB2(y,x) = uint8(b11);
elseif(xl>0.5 && yl<=0.5)
RR2(y,x) = uint8(r21);
GG2(y,x) = uint8(g21);
BB2(y,x) = uint8(b21);
elseif(xl<=0.5 && yl>0.5)
RR2(y,x) = uint8(r12);
GG2(y,x) = uint8(g12);
BB2(y,x) = uint8(b12);
else
RR2(y,x) = uint8(r22);
GG2(y,x) = uint8(g22);
BB2(y,x) = uint8(b22);
end
end
end
end
OUT(:,:,1) = RR;
OUT(:,:,2) = GG;
OUT(:,:,3) = BB;
OUT2(:,:,1) = RR2;
OUT2(:,:,2) = GG2;
OUT2(:,:,3) = BB2;
imwrite(OUT, 'linear.bmp', 'bmp');
imwrite(OUT2,'near.bmp','bmp');
figure,imshow(OUT),title('放大后的雙線性插值圖像');
figure,imshow(OUT2),title('放大后的最近鄰域插值圖像');
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -