如何实现PS中的缩放算法

---原理、实现---

这一次来关注一下PS的缩放问题,PS使用的缩放方法是近邻取样插值(nearest neighbor interpolation)算法。但相比一般邻近算法作了改进,我们要做的就是找到这个改进的算法。

下面先简单说明近邻取样插值的一般方法:按照缩放比例使用公式Sx=Dx*(Sw/Dw)求出目标像素对应的源像素(参见参考文章1)。开始我也使用的这种方法,但缩放结果与PS相比,像素插入位置不同,主要区别PS中是以中线为基准两边对称的。但沿着对称的思路想了几个方法,都达不到要求,上网搜也没有头绪。

这个状况让我想起当初解决蚂蚁线问题时情形(link):从对流动蚂蚁线表面现象的简单模拟到经过仔细观察思考发现,流动的线条只是一种更简单高效算法的外在表现。意识到这点之后,不再乱试,试着从定义出发重新审视这个问题,目标是找到一个计算方便、形式简单乃至具有美感的(对称)、最好不用除法,可以精确描述位置的算法。

举个例子重新描述一下问题,一个10 x 10的图像,放大130%,会生成一个13 x 13的图像,因为纵横向放大比例相同,只需要计算一行数据即可,从10个点到13个点,多了3个点,现在问题来了,要把10个像素插到13个空位的哪10个位置?同时多出来的3个空位用10个中的哪个像素重复填充?

想象这样一种需要一个像素一个像素处理的插值算法,再结合上面的算法要求——插值、一步一步处理、对称、不用除法、精确描述——灵感出现,这些东西与Bresenham算法的要素特点是不是很相似呢?那是不是可以使用Bresenham算法解决这个问题呢?有点小激动,马上动手,一番画图推导计算之后,不出意外确实可以,并且有了Bresenham关键字,也很容易的搜索到了参考文章2。

下面说一下基本思路,就是把像素放大,原来的10个像素,放大成10个13x13的像素,13个像素放大成13个10x10的像素,使13个"像素"能无缝填充到10"像素"的空间中去,然后通过对比确定填充的对应像素。此时可以看作是一个填格子的游戏,10个长度13的大格子排一列,然后用13个长度为10的小格子填充,最后做一个对比,小格子落到哪个大格子的部分多,就填到哪个大格子,如果落入不同大格子的两个部分相同,算哪个都可以,但填入后一个格子计算简单(一图顶千言,参见图1)。

图1

---代码及程序(masm32)---

http://files.cnblogs.com/hhh2000/Zoom.zip

---参考文章---

1、高质量的快速的图像缩放 上篇 近邻取样插值和其速度优化 http://blog.csdn.net/housisong/article/details/1404896
一般的近邻取样插值算法

2、基于Bresenham算法的图像快速缩放处理 http://www.doc88.com/p-699581250411.html
相同的算法、有推导、有公式

3、Quick image scaling algorithms and code  http://www.compuphase.com/graphic/scale.htm  http://willperone.net/Code/codescaling.php
另一种Bresenham类算法,形式更简单但不对称

时间: 2024-12-23 23:06:21

如何实现PS中的缩放算法的相关文章

关于图像高速缩放算法,目前看到的最好的最清晰的一篇文章

http://www.myexception.cn/image/1630385.html 关于图像快速缩放算法,目前看到的最好的最清晰的一篇文章 昨天开始写一个录制屏幕和声音存储为视频文件的程序,差不多完成了. 屏幕录制使用方法:抓屏(方法很多,BitBlt.DirectX.MirrorDriver等),缩放,X264压缩(开源的,自己封装) 声音录制使用方法:声卡采集PCM数据,AAC压缩(开源的,自己封装) 最后打包复用为MP4文件,可以使用ffmpeg或者mp4v2等. 经过断断续续一天的

图像缩放算法【转】

转自:http://blog.csdn.net/qq_21792169/article/details/51020005 版权声明:本文为Linux_Google原创文章,转载请加上原创链接. 转载别人的,但是这篇文章写得确实太好了,所以想分享出来,可是原创文章地址找不到了 ,很可惜. 图像缩放算法 摘要:首先给出一个基本的图像缩放算法,然后一步一步的优化其速度和缩放质量: 高质量的快速的图像缩放 全文 分为:      上篇 近邻取样插值和其速度优化      中篇 二次线性插值和三次卷积插值

11、图像缩放算法

正文: 为了便于讨论,这里只处理32bit的ARGB颜色:  代码使用C++;涉及到汇编优化的时候假定为x86平台;使用的编译器为vc2005;  为了代码的可读性,没有加入异常处理代码;  测试使用的CPU为AMD64x2 4200+(2.37G)  和 Intel Core2 4400(2.00G); 速度测试说明:  只测试内存数据到内存数据的缩放  测试图片都是800*600缩放到1024*768; fps表示每秒钟的帧数,值越大表示函数越快 //////////////////////

图像缩放算法

图像缩放算法较多,下面仅以最邻近插值算法和双线性插值算法作介绍. 如下图1所示,表示原始图像和缩放以后的图像. 图1 图像缩放(原始图像à缩放图像) 图像缩放就是将原始图像中的点经过某一算法映射到目标图像的点的行为,即要找到目标图像中的点p1对应在原始图像中点p0,简单而言就是找点p0. 假设: 原始图像src的分辨率为(srcW * srcH): 目标图像dst的分辨率为(dstW * dstH). 那么: 原始图像宽与目标图像宽的比例 原始图像高与目标图像高的比例 由 所以,原始图像中的点p

如何实现PS中使用选择框、套索等工具后形成的蚂蚁线效果

用过PS的同学都知道使用选择框.套索.魔棒工具选择区域后,边线会有一个黑白条纹交替移动产生的动画,俗称蚂蚁线,作用是更明显的突出选择区域范围. ---原理--- 通过观察PS,发现:一.线条可以任意复杂:二.并且不是只往线条指向的一个方向移动:三.不同位置角度的黑白线段长度不同:四.可以跟随图片缩放自然的产生不同效果:五.当生成很多线条时,CPU占用率也很低(比如在复杂图像中使用魔棒时). 如何做到的呢?一开始我把这些"线"当成一条条黑白相间的线条处理,发现:一.达不到PS的效果:二.

谈谈数字图像的缩放算法[转]

数字图像的缩放,是一个十分有趣的问题,又是一个看似简单,但又有些复杂的问题.许多朋友在具备一定的计算机图形编程的基础知识以后,都可以自己设计出一些简单的位图缩放算法.在计算机图形学和数字图像处理等学科里面,已经详细的研究过了数字图像缩放这个问题,并且已经有了成熟的算法.一些朋友由于没有学习过计算机图形学和数字图像处理,所以凭借自己的想法设计的位图缩放算法存在许多缺陷.在本文中,我将和大家一起来研究这个问题,并且学习前人所总结出来的算法. 图像的概念很容易理解,你睁开眼睛,所看到的都是图像了.而一

在.NET中应用MATLAB算法

在科学研究和工程应用中,往往要进行大量的数学计算,其中包括矩阵运算.这些运算一般来说难以用手工精确和快捷地进行,而要借助计算机编制相应的程序做近似计算.目前流行用Basic.Fortran和c语言编制计算程序, 既需要对有关算法有深刻的了解,还需要熟练地掌握所用语言的语法及编程技巧.对多数科学工作者而言,同时具备这两方面技能有一定困难.通常,编制程序也是繁杂的,不仅消耗人力与物力,而且影响工作进程和效率.为克服上述困难,美国Mathwork公司于1967年推出了"Matrix Laborator

Java中的经典算法之冒泡排序(Bubble Sort)

Java中的经典算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后.然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后.重复第一趟步骤,直至全部排序完成. 举例说明:要排序数组:int[] arr={6,3,8,2,9,1}; 第一趟排序: 第一次排序:6和3比较,6大于3,交换位置:  

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型