专做品质游的网站,济南建网站送400电话,找兼职做网站建设,企业网站模板下载哪家好实验内容#xff1a; 用双线性内插法实现位深度为8的灰度图像的缩放。 思路#xff1a; 输入原图像以及缩放后图像的像素要求#xff08;宽度*高度#xff09;#xff0c;处理后输出新图像。 我是用matlab来实现scale(input_img,scale_size)函数的#xff0c;输入图像路径…实验内容 用双线性内插法实现位深度为8的灰度图像的缩放。 思路 输入原图像以及缩放后图像的像素要求宽度*高度处理后输出新图像。 我是用matlab来实现scale(input_img,scale_size)函数的输入图像路径以及要求实现的宽度scale_w和高度值scale_h即可。通过matlab把原图像转化为img矩阵这样矩阵img(a, b)元素的值就是原图像高度为a宽度为b处的像素值。 设处理前后图像的宽度和高度分别为w、hscale_w、scale_h。 如上图所示row对应的是高度设为x轴col对应的是宽度设为y轴value对应的是灰度值设为z轴。 通过缩放比例可以求得新图像B在(i,j)处对应原图像的点为(x,y)其中x i*h/scale_hy j*w/scale_w。
但是这两个值可能为浮点数而像素中的位置是整数所以这个点在原图像中对应的可能是“虚”点。所以我们需
要根据找该“虚”点周围的四个点来进行双线性插值得到新图像的灰度值。我们应该取的是(x,y)邻近的四个像素
(x0,y0) 、(x0,y1) 、(x1,y0) 、(x1,y1)它们对应的灰度值为f(x0,y0) 、f(x0,y1)、 f(x1,y0)、 f(x1,y1)。 先对x方向进行插值再对y方向进行插值计算如下 反过来先对y方向 显然邻近像素的x1-x0 y1-y0 1 整理式子得到 这里u、v分别是x、y的小数部分即u x - x0; v y - y0 要注意的是上述公式img(a,b)中的a和b不能小于1所以当x和y小于1时需要将其重新赋值为1。 代码
function output_img scale(input_img, scale_size)
%Input - input_img is a two-dimensional matrices storing image
% - scale_size is a tuple of [width, height] defining the spatial resolution of output
%Output - output_img is the same as input_imgimg imread(input_img); %读取输入图片的数据
[h,w] size(img); %获取行和列即原图的高度和宽度scale_w scale_size(1); %根据输入获得缩放后的新宽度
scale_h scale_size(2); %根据输入获得缩放后的新高度
output_img zeros(scale_h, scale_w); %初始化for i 1 : scale_h %缩放后的图像的i,j位置对应原图的x,yfor j 1 : scale_wx i * h / scale_h;y j * w / scale_w;u x - floor(x);v y - floor(y); %取小数部分if x 1 %边界处理x 1;endif y 1y 1;end%用原图的四个真实像素点来双线性插值获得“虚”像素的像素值output_img(i, j) img(floor(x), floor(y)) * (1-u) * (1-v) ...img(floor(x), ceil(y)) * (1-u) * v ...img(ceil(x), floor(y)) * u * (1-v) ...img(ceil(x), ceil(y)) * u * v;end
endimwrite(uint8(output_img), ../output_img.png); %保存处理后的图像
imshow(input_img); %显示原图
figure,imshow(uint8(output_img)) %显示处理后的图像运行时若图片在代码上一级目录则输入scale(../a.png, [450,300]); 效果图
原图为384*256
缩小成192*128
放大成450*300
缩放成500*200 // 转载https://blog.csdn.net/Stella_Chan/article/details/78025020?locationNum5fps1