概述
图像的放大与缩小是图像处理中很经常碰到的问题,也是现实中经常要应用的,如一张图片太小,看不行的情况下就需要对去进行放大;在一些文档排版的时候有需要对一下大的图片进行缩小。
图像的放大与缩小在物理意义上来说是图像的像素的尺寸放大或缩小相应的比例,但像素的尺寸是不能改变的,因此我们只能通过增加(或减少)相应的像素来放大(或缩小)图片。在算法实现中最简单的是等距离采样法。
算法的实现步骤:
(1)计算采样间隔
设原图的大小为W*H,将其放大(缩小)为(k1*W)*(K2*H),则采样区间为
ii=1/k1;jj=1/k2;
当k1==k2时为等比例缩小;当k1!=k2时为不等比例放大(缩小);当k1<1&&k2<1时为图片放大,k1<1&&k2>1时时图片缩小。
(2)求出放大(缩小)后的图像
设原图为F(x,y)(i=1,2,……W;j=1,2,……H),放大(缩小)的图像为G(x,y)(i=1,2,……M;j=1,2,……N,其中M=W*k1,N=H*k2),则有
G(x,y)=f(ii*i,jj*j)
举例说明:
原图(6*4)
f11 f12 f13 f14 f15 f16
f21 f22 f23 f24 f25 f26
f31 f32 f33 f34 f35 f36
f41 f42 f43 f44 f45 f46
缩小比例k1=0.6,k2=0.7
f12f13f15f16
f32f33f35f36
f42f43f45f46
当然,使用等距采样法实现图片放大与缩小有一个缺点就是:缩小时未被选取的点的信息无法反映在缩小的图像上,放大时会出现整个小块区域像素相同,图像不清晰的,特别是缩放比例很大时。如下图
2048*1536缩小为100*80时的效果 100*80放大到600*400的效果
要解决这个问题,请看下一节“图像的放大与缩小(1)——双线性插值放大与均值缩小”
算法源代码(java)
/**
* 读取图片
* @param srcPath 图片的存储位置
* @return 返回图片的BufferedImage对象
*/
public static BufferedImage readImg(String srcPath) {
BufferedImage img = null;
try {
img = ImageIO.read(new File(srcPath));
} catch (IOException e) {
e.printStackTrace();
}
return img;
}
/**
* 将图片写入磁盘
* @param img 图像的BufferedImage对象
* @param s
* @param distPath 图像要保存的存储位置
*/
public static void writeImg(BufferedImage img, String s, String distPath) {
OutputStream out = null;
try {
//int imgType = img.getType();
//System.out.println("w:" + img.getWidth() + " h:" + img.getHeight());
out = new FileOutputStream(distPath);
ImageIO.write(img, s, out);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 等间隔采样的图像放大(缩小)
* @param img 要放大(缩小)的图像对象
* @param m 放大(缩小)后图像的宽
* @param n 放大(缩小)后图像的高
* @return 返回处理后的图像对象
*/
public static BufferedImage flex(BufferedImage img, int m, int n) {
float k1 = (float)m/img.getWidth();
float k2 = (float)n/img.getHeight();
return flex(img, k1, k2);
}
/**
* 等间隔采样的图像放大(缩小)
* @param img 要放大(缩小)的图像对象
* @param k1 要放大(缩小)的列比列
* @param k2 要放大(缩小)的行比列
* @return 返回处理后的图像对象
*/
public static BufferedImage flex(BufferedImage img, float k1, float k2) {
float ii = 1/k1; //采样的行间距
float jj = 1/k2; //采样的列间距
//int m=0 , n=0;
int imgType = img.getType();
int w = img.getWidth();
int h = img.getHeight();
int m = (int) (k1*w);
int n = (int) (k2*h);
int[] pix = new int[w*h];
pix = img.getRGB(0, 0, w, h, pix, 0, w);
System.out.println(w + " * " + h);
System.out.println(m + " * " + n);
int[] newpix = new int[m*n];
for(int j=0; j<n; j++) {
for(int i=0; i<m; i++) {
newpix[j*m + i] = pix[(int)(jj*j)*w + (int)(ii*i)];
}
}
System.out.println((int)((m-1)*ii));
System.out.println("m:" + m + " n:" + n);
BufferedImage imgOut = new BufferedImage( m, n, imgType);
imgOut.setRGB(0, 0, m, n, newpix, 0, m);
return imgOut;
}
分享到:
相关推荐
实现图像、影像下采样,采样方法有最邻近采样法、二次插值法、双三次卷积法。matlab实现。
在图像的放大和缩小的过程中,需要计算新图像像素点在原图的位置,如果计算的位置不是整数,就需要用到图像的内插,我们需要寻找在原图中最近得像素点赋值给新的像素点,这种方法很简单是最近邻插法,这种方法好理解...
本代码设置P6.0及P6.1两路AD采样,分别采输出电压及电感电流,系统开关频率为50KHz采样周期设置为5KHz。本代码选用外部晶振XT1,通过PLL倍频。ACLK、SMCLK、MCLK均选择DCOCLK为时钟源。本代码通过SCI_A0把采集到电压...
matlab 自己编写的图像图像缩小代码(基于等间间隔以及局部均值)缩小
本实验探讨了灰度图像的下采样以及量化的技术,并加以实现(采用Matlab实现),通过实验探讨下采样的两种做法(删除行列以及邻域平均)比较了其处理结果;通过探讨量化的两种做法(保留高位以及采用IGS-Improved ...
该代码实现了以2为因子的图像升采样和降采样功能。 降采样包括使用平滑滤波器(with using the averaging filter)和不使用平滑滤波器(without using the averaging filter)两种方法。 升采样包括像素点直接复制...
圆梦小车系列之: 圆梦小车装配说明 —— 码盘采样器
图像上采样——凸优化方法,附带测试图片。代码有详细的流程介绍和分类说明,有利于读者深入理解利用matlab里cvx进行图像上采样的具体方法
图像降采样和升采样 Matlab 代码。 该代码实现了以2为因子的图像升采样和降采样功能。 降采样包括使用平滑滤波器(with using the averaging filter)和不使用平滑滤波器(without using the averaging filter)两种方法...
GIS实战应用案例(数据+代码+成品图)-时空维度的转换:用空间的方法研究时间——时间维度采样数据的插值分析及可视化.zip
不对称规则采样法采用在每个载波周期采样两次,即在三角波的顶点位置采样,又在三角波的底点位置采样,这样形成的阶梯波与正弦波的逼近程度会大大提高,比对称规则采样法的精度要高。不对称规则采样法得28335实现过程...
自己写的图像下采样matlab程序,是将图像变成列向量的形式来求解下采样的图像,并且给出了下采样的矩阵。
定时采集电位器电压,并用数码管显示,带报警
圆梦小车系列之: 圆梦小车二代装配说明——轨迹采样
基于MATLAB的频率采样法设计FIR滤波器.pdf
为了弥补传统图像放大算法的锯齿效应,统计分析了图像像素变化特点,将图像分成平滑、纹理和边缘,对平滑和纹理区根据其局部区域的同态性,提出了基于局部多项式逼近的图像放大:运用置信区间交集法则将图像分割为...
采用Gibbs采样方法用于图像分割,涉及到K—means聚类的初始化以及形态学处理
matlab 图像下采样代码,给定原始图像和下采样比例,得到下采样之后的图像矩阵
FIR滤波器设计文献集-基于MATLAB的频率采样法设计FIR滤波器.pdf 本帖最后由 zyzhang 于 2012-4-24 18:52 编辑 载自各大数据库希望能帮到大家 基于Matlab的FIR带通滤波器的设计与仿真.pdf 基于...
介绍了SPWM不规则采样法 讲解的比较透彻 带有波形图