`
luoweifu
  • 浏览: 63341 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

图像的放大与缩小(1)——等距采样法

 
阅读更多

概述

图像的放大与缩小是图像处理中很经常碰到的问题,也是现实中经常要应用的,如一张图片太小,看不行的情况下就需要对去进行放大;在一些文档排版的时候有需要对一下大的图片进行缩小。

图像的放大与缩小在物理意义上来说是图像的像素的尺寸放大或缩小相应的比例,但像素的尺寸是不能改变的,因此我们只能通过增加(或减少)相应的像素来放大(或缩小)图片。在算法实现中最简单的是等距离采样法。

算法的实现步骤:

(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;
	}
	


分享到:
评论

相关推荐

    Visual C++数字图像处理典型算法及实现——图像缩放

    在图像处理领域,图像缩放是一项基础且重要的操作,它涉及到像素级别的重新采样和插值,以改变图像的尺寸。Visual C++作为一款强大的编程环境,提供了丰富的库支持,如MFC(Microsoft Foundation Classes)和OpenCV...

    图像缩放--双线性内插法及其python实现(图文代码)(csdn)————程序.pdf

    这种方法通过在两个方向上分别进行线性插值来计算新位置的像素值,从而达到放大或缩小图像的目的。双线性内插法相较于最近邻内插法,能提供更平滑且更精确的缩放效果,因为它考虑了目标像素周围的多个相邻像素,而...

    图像缩放滤波

    在进行这些操作时,必须处理一个问题——采样率的变化。根据奈奎斯特定理,图像缩小可能导致高频信息丢失,而放大则可能引入噪声。 二、缩小过程与低通滤波 图像缩小过程中,由于采样率降低,原有的高频信息可能...

    matlab 图像缩放 —— 最近邻插值 和 双线性插值

    这种方法考虑了相邻像素的影响,提供了一种平滑过渡的效果,尤其在图像放大时,可以降低像素化的程度,但可能导致边缘略微模糊。 2、代码实现 ```matlab V2 = interp2(X, Y, Z, P, Q, 'linear'); ``` 这里的'...

    bicubic_图像处理bicubic_图像变换_图像_

    在计算机图形学和图像处理领域,bicubic插值是一种高级的像素级重采样技术,常用于图像放大或缩小。标题中的“bicubic_图像处理bicubic_图像变换_图像”揭示了我们要探讨的主题——bicubic算法在图像处理中的应用,...

    数字与图像处理复习题

    - **图像的几何变换**:包括图像的平移、旋转、放大或缩小等,用于改变图像的大小和形状。 - **图像变换**: - 通过数学方法将图像从空间域转换到其他域,如频域、时频域等。 - 常见的图像变换有**傅里叶变换**和...

    14.图像插值方法1

    这种方法在保持边缘清晰度和细节表现方面具有明显的优势,尤其适用于图像放大后仍需保持较高清晰度的场合。不过,双三次插值的计算复杂度较高,相应的处理速度较慢,这在实际应用中可能会成为一个限制因素。 综合来...

    数字图像处理在matlab中的基本操作.pdf

    以下是一个使用 MATLAB 进行图像缩放的代码示例,分别使用这三种插值方法将图像放大两倍: ```matlab J = imread('hd1.bmp'); x1 = imresize(J, 2); % 最近邻插值 x2 = imresize(J, 2, 'bilinear'); % 双线性插值 ...

    matlab开发-Magickernelresizing

    图像重采样是图像处理中的基本操作,它涉及到改变图像的分辨率,例如放大或缩小图像。传统的重采样方法如最近邻插值、双线性插值等,虽然简单易用,但在处理某些情况时可能会导致图像失真,产生明显的像素化或模糊...

    bicubic interpolation-matlab.rar_Bicubic_Bicubicinterpolation_ma

    双三次插值是一种高级的图像重采样技术,主要用于提高图像放大或缩小后的质量,减少像素化现象。在MATLAB环境中,我们可以利用编程实现这一算法。本资源包含了一个名为"bicubic interpolation-matlab.rar"的压缩包,...

    行业分类-物理装置-一种图像缩放处理方法及装置.zip

    1. **图像缩放的基本原理**:包括像素插值、重采样、保持比例等基本概念,以及不同缩放类型的差异(放大、缩小)。 2. **缩放算法**:可能包括最近邻插值、双线性插值、三次样条插值、 lanczos 插值等经典算法的...

    行业文档-设计装置-基于FPGA平台的高还原度空域图像缩放方法.zip

    高还原度的图像缩放意味着在放大或缩小图像时,尽可能地保持原始图像的细节和质量,减少失真,确保视觉效果接近原始图像。 文档可能详细介绍了以下内容: 1. FPGA平台的优势:阐述FPGA如何提供并行处理能力,以实现...

    iOS游戏应用源代码——manucorporat-AWTextureFilter-c7e55d7.zip

    这些过滤方法能平滑图像边缘,减少锯齿现象,提高图像在放大或缩小过程中的质量。源代码中应有对这些滤波算法的实现,通过对纹理采样率的控制,达到理想的画面效果。 再者,性能优化是iOS游戏开发中的一项挑战。在...

    滤波器代码.docx

    4. **图像缩小**:基于等间隔采样原则,减少图像的尺寸。 5. **图像放大**:通过像素复制或插值方法增加图像尺寸。 6. **图像错切**:沿某个方向扭曲图像,使图像发生形变。 #### 十六至二十、图像滤波 1. **均值...

    EBF-561数字图像处理实验指导书(Ver1.0).pdf

    - **目标:** 实现图像放大或缩小。 - **内容:** 通过插值算法实现图像尺寸的调整。 - **实验三:图像旋转实验** - **目标:** 实现图像的旋转。 - **内容:** 应用旋转矩阵来调整图像的角度。 **7. 图像分析*...

    低分辨率人脸识别1

    【低分辨率人脸识别】技术主要关注的是在人物重识别(Person Re-Identification,简称re-id)过程中,如何有效地处理低分辨率的probe图像与高分辨率的gallery图像的匹配问题。在实际应用中,例如监控摄像头捕捉的...

    双线性插值

    双线性插值是一种在图像处理和计算领域广泛使用的插值方法,特别是在图像放大和缩小过程中,用于平滑像素间的过渡,提高图像质量。这种方法基于多边形内插原理,适用于二维数据集,如图像的像素矩阵。双线性插值通过...

Global site tag (gtag.js) - Google Analytics