本学期修读“数学实验”相关课程,课程设计以“双线性插值法实现图像缩放”为研究方向,写篇博文记录一下自己的心路历程–
数学模型建立:
数学模型说明:
数学模型建立中的z1,z2和z分别对应于数学模型说明中三个相似三角形求解过程,以具体示例说明:
所谓双向插值法,就是在两个方向上进行插值求解虚点处的像素值,以(1.2,1.6)点为例,首先便是在x = 1上进行插值,利用相似三角形进行像素值求解:(1.6-1)/1 = 像素值1 /(11-7)可以计算出x = 1方向上的像素值。另外在x = 2方向上进行插值求解虚点处的像素值,利用相似三角形进行像素值求解:(1.6-1)/1 = 像素值2/(14-10)可以计算出x = 2方向上的像素值。最终在x方向上进行第三个相似三角形求解像素值:(1.2-1)/1 = 像素值3/(像素值2 – 像素值1)
本质说明---------已知四个相邻整数坐标点的函数值,如何通过数学建模的方式计算四个点所围成正方形中任意一点的函数值。
代码如下(示例):
% 灰度图像处理
function test
scale('image_1.png',[512,768])
%'image_1'---目标图像 [512,768]---缩放目标大小
function output_img = scale(input_img,scale_size)
A = imread(input_img); % 图像读取--imread
img = A(:,:,3); % imread命令读取得三个矩阵,灰度图像,三个矩阵相同
[h,w] = size(img); % 获取行和列,即原图像的大小
% h = 256 w = 384
scale_h = scale_size(1); % 根据输入获取缩放后的图像的大小,即缩扩后图像的高度和宽度
scale_w = scale_size(2);
output_img = zeros(scale_h,scale_w); % 初始化全零矩阵,用于存储缩扩后图像像素值
for i = 1:scale_h
for j = 1:scale_w % 遍历处理后图像每一个像素点,计算像素值
x = i.*h / scale_h; % x:高度
y = j.*w / scale_w; % y:宽度
u = x - floor(x);
v = y - floor(y); % 获取小数部分,用于相似计算
if x < 1
x = 1;
end % 边缘处理
if y < 1
y = 1;
end % 边缘处理
output_img(i,j) = v.*(u.*img(ceil(x),ceil(y)) + (1 - u).*img(floor(x),ceil(y))) + ...
(1 - v).*(u.*(img(ceil(x),floor(y))) + (1-u).*img(floor(x),floor(y))); % 特定点像素计算公式
end
end
% imwrite(uint8(output_img),'../output_img.png');
imshow(input_img)
title('原灰度图像')
figure,imshow(uint8(output_img)) % 显示处理后的图像 unit8保证像素值取值在0-255(2^8)之间
title('插值法压缩图像')
figure,imshow(imresize(img,2)) %matlab自带图像缩放函数,与插值法进行比较
title('函数法压缩图像')
function test
scale('image_3.jpg',[2160,3840])
function output_img = scale(input_img, scale_size)
img = imread(input_img);
[h,w] = size(img(:,:,1))
scale_h = scale_size(1);
scale_w = scale_size(2);
output_img = zeros(scale_h, scale_w,3); %初始化三个全零矩阵,分别用于RGB三原色存储
for m = 1:3 % 循环三次,针对于RGB三个通道
for i = 1 : scale_h %缩放后的图像的(i,j)位置对应原图的(x,y)
for j = 1 : scale_w
x = i * h / scale_h;
y = j * w / scale_w;
u = x - floor(x);
v = y - floor(y); %取小数部分,对应于相似比例的计算
if x < 1 %边界处理
x = 1;
end
if y < 1
y = 1;
end
%用原图的四个真实像素点来双线性插值获得“虚”像素的像素值
output_img(i, j,m) = img(floor(x), floor(y),m) * (1-u) * (1-v) + ...
img(floor(x), ceil(y),m) * (1-u) * v + ...
img(ceil(x), floor(y),m) * u * (1-v) + ...
img(ceil(x), ceil(y),m) * u * v;
end
end
end
imshow(input_img); %显示原图
title('原彩色图像')
figure,imshow(uint8(output_img)) %显示处理后的图像
title('插值法压缩图像')
figure,imshow(imresize(img,2))
title('函数法压缩图像')