MATLAB实现数图的缩放:双线性内插法
来源:互联网 发布:空间数据库吴信才 编辑:程序博客网 时间:2024/05/17 20:02
实验内容:
用双线性内插法实现位深度为8的灰度图像的缩放。
思路:
输入原图像以及缩放后图像的像素要求(宽度*高度),处理后输出新图像。
我是用matlab来实现scale(input_img,scale_size)函数的,输入图像路径以及要求实现的宽度scale_w和高度值scale_h即可。通过matlab把原图像转化为img矩阵,这样矩阵img(a, b)元素的值就是原图像高度为a,宽度为b处的像素值。
设处理前后图像的宽度和高度分别为w、h,scale_w、scale_h。
如上图所示,row对应的是高度,设为x轴;col对应的是宽度,设为y轴;value对应的是灰度值,设为z轴。
通过缩放比例,可以求得新图像B在(i,j)处对应原图像的点为(x,y)(其中x= i*h/scale_h,y= 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,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) = 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; endendimwrite(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:
- MATLAB实现数图的缩放:双线性内插法
- 数图的缩放:双线性内插法
- 缩放图像的双线性内插法
- 图像缩放--双线性内插法
- [图像]图像缩放算法-双线性内插法
- [图像]图像缩放算法-双线性内插法
- C++图像缩放(StretchBlt,StretchDIBits,双线性内插法)
- 图像的近邻、双线性、三次内插法介绍
- 图像处理中两种基本的插值算法(最邻近插值法和双线性内插法)
- 图像处理中两种基本的插值算法(最邻近插值法和双线性内插法)
- OpenCV双线性缩放函数实现
- MATLAB实现双线性内插算法
- matlab图像处理基础知识1(双线性插值matlab实现--等比例调整缩放倍数)
- 双线性插值实现图像缩放
- 双线性插值的图像缩放算法的研究与实现
- 双线性插值的图像缩放算法的研究与实现
- 双线性插值的图像缩放算法的研究与实现
- 双线性插值的图像缩放算法的研究与实现
- Android基础篇——Activity
- 机器学习学习笔记.day8
- NOI-OJ矩形分割
- 关于MySQL数据库不能使用别名的解决方法
- MySQL InnoDB中的consistent read和Locking Reads
- MATLAB实现数图的缩放:双线性内插法
- Eclipse导入Maven项目,本地中央仓库缺少项目中Jar解决方案。
- java笔记,从一个录入字符串删除指定字符串
- 对象族谱之归纳总结
- Elasticsearch大文件检索性能提升20倍实践(干货)
- python学习要点
- 当 position:fixed 遇上 transform
- 常用SQL操作总结
- BZOJ1066【SCOI2007】蜥蜴 <网络流>