往年春节可能聚三、四影友往西北拍片去。今年没新相机的刺激,也就懒得再去。除老少边穷外,其它地方去不得,路上加油要排队,商家宰人用斧子直接砍头。这不,海南三亚都10万一晚上了,吃人不吐骨头。
正好前不久设计锐化算法时联想到可用来缩放图像,就用这几天时间做一下图像的缩放吧。
原来对Photoshop的二次立方图像缩放崇拜得不得了,图像放大不出锯齿,缩小基本看不出清晰度损失。怎么想到挑它的刺?不过前不久做了一个图像缩小的程序,虽然还不完善,但发现清晰度已大大高于PS的二次立方算法,只是锯齿也有点大。因此想到二次立方并不是无懈可击,用新算法应该能更好。
说干就干,先把算法设计好。基本方法为可调节的高斯函数,比二次立方显然就高一个等级啦。还要能适应非整数倍缩放采样时采样中心偏离原像素中心时的情况,要精确修正,后来发现PS的问题就在于不能精确修正,因此而丢掉一些细节。 另外锐度的高低应该有一些选择,以适应不同偏好。

其中锐度被设计为11级可选,增强、减弱各5级。用长边像素定义了缩放的比例。这种方式比较适合处理上网数据。如果有一大批要上网的图片,定义好长边像素800,一次可以搞定几百张片子的缩小。
编程还是有一点困难的,要考虑只有200-300M可用内存的情况下,高效缩放单张图片几个G的数百张照片,颇费一番心思。春节没怎么出门,除了看电视就是编程了。现在来看看它的效果吧。
示例的图原尺寸为3356x9676像素,我们把它缩成长边为3000像素的图像,PS算出来的短边是1041像素,我算出来是1040,看来我舍去得多了一点,不过没本质区别。我们先来对比一下Photoshop与我用锐度0做出的图像。

Photoshop缩小的头部

eH锐度0缩小的头部
第一感觉是我用锐度0做出来的比PS的柔和,有人要说了,“柔和”是不是“模糊”的比较婉转的说法。其实如果细看一下你会发现我的锐度0一点不比PS模糊,甚至还更清晰一点。注意右边(演员左脸)的头饰,那个盘成发条状的东西,还有三根“弹簧”中间的一根,我的锐度0都能看出纹理,而PS的没有了。看下面袖子部分更明显。PS右手袖口的针脚有的清楚有的模糊,而我的锐度0是个个清楚。

Photoshop缩小的袖口部分

eH锐度0缩小的袖口部分
那么柔和的感觉从何而来呢?注意看一下演员左右腮部的贴片,我做的锐度0边缘明显柔和,而PS做的好像镶了一条亮边。如果放大到200-300%,你会看到锐度0有更多的过渡像素。柔和的感觉正是来自于对锯齿感的消除。胸口的绣花两者区别更大。
稍稍加一点锐度吧,省得有人矫情。下面是锐度1做出来的效果,不仅“发条”和“弹簧”的纹理更清晰,袖口的针脚和绣花的细节也更清晰。而柔和的程度损失不多。

eH锐度1缩小的头部

eH用锐度1缩小的袖口
对比一下三种方式做出的袖口图中两根细的黑色头也能发现,PS做出来的粗而没纹理,而我做出来的仅锐度0就更细且有纹理,锐度1就更不用说了。
跳着给其它的效果吧。锐度3的

eH锐度3缩小的头部

eH锐度3缩小的袖口
已经非常清晰,柔和程度还不错。
放大
过去由于数字相机的像素数低,所以在印照片时经常有放大。而最近这种操作很少了,多数是把图片放到网页上,需要的是缩小。不过也常有人要把照片印得比较大,这时如果没有一个好的放大程序图片要么出现马赛克现象,要么就变模糊。
PS的放大功能原来我一直是比较满意的。要用小数据出大片时也往往先要到PS里放大再印。但昨天研究PS的放大才发现它偷偷地含了一个锐化过程在里面。而这个锐化还用得是比较老的USM锐化,白边比较严重。但它的采样还是有可取之处,边缘扩大后锯齿细而均匀。我们就用下面的图像来对比一下放大的效果。

这幅图像的原始像素数是696x838像素。我们把它的长边放大到1500像素,放大1.789976倍。下面是两者的效果

Photoshop放大的眼睛部分,其中已经隐含了一个锐化

eH放大的眼睛,也按PS的强度加了一个eH算法的锐化

PS放大的头饰

eH放大的头饰
可以看出,除锐化的风格略有不同,两者的质量差异很小。毕竟放大是在有限的信息上做文章,可以作为的空间很小。