使用Lanczos核进行图像上采样
原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/upsampling-images-with-lanczos-kernel
20818 为本文评分:
2.7
使用Lanczos核进行图像上采样
匿名 2016年7月7日 星期四
图像重采样是IDL中非常常见的操作,它既可能隐式发生,也可能显式发生。隐式重采样发生在IDLgrImage渲染时。当目标渲染区域包含的像素比原始图像少时,会发生下采样。当目标区域大于原始图像时,则会发生上采样。上采样算法有多种选择。最简单的是纯像素复制来填补间隙。当需要仔细观察原始数据时,这种方法很有用。然而,如果目标是寻找场景中可能接近图像分辨率极限的细节,那么就应该选择更复杂的重采样算法。有几种常用的选项。双线性插值和三次样条插值都是IDL中CONGRID函数可用的选项。Lanczos和Lagrange重采样是另外两种计算量更大的选择。在下面的代码中,我将展示一个比较Lanczos重采样核与双线性和像素复制的例子。Lanczos重采样通常更受青睐,因为它能够保持甚至增强局部对比度,而双线性插值往往会产生模糊效果。
function lanczos, data
xval = [-3:3:.25]
lanc3 = 3*sin(!pi*xval)*(sin(!pi*xval/3d)/!pi/!pi/xval/xval)
lanc3[where(xval eq 0)] = 1
l2d = lanc3 # lanc3
; high resolution version
msk = fltarr(data.*dim*4)
msk[0:*:4,0:*:4] = data
hi = convol(msk, l2d, /edge_trunc)
hi = byte(round(hi>0<255))
return, hi
end
pro upsample_example
compile_opt idl2,logical_predicate
; Read the original image data
f = filepath('moon_landing.png', subdir=['examples','data'])
data = read_png(f)
dim = data.*dim*
window, xsize=dim[0], ysize=dim[1], 0, title='Original full size'
tv, data
; Define a zoomed in are on the flag.
xs = 200
ys = 165
dx = 40
dy = 40
; display upsampled 4x with pixel replication
window, xsize=160, ysize=160, 1, title='CONGRID pixel-replication'
tv, congrid(data[xs:xs+dx-1,ys:ys+dy-1],160,160)
; display upsampled 4x with bilinear interpretation
window, xsize=160, ysize=160, 2, title='CONGRID linear'
tv, congrid(data[xs:xs+dx-1,ys:ys+dy-1],160,160,/interp)
; display upsampled 4x with Lanczos convolution
window, xsize=160, ysize=160, 3, title='Lanczos'
tv, (lanczos(data))[xs*4:xs*4+dx*4-1,ys*4:ys*4+dy*4-1]
end
结果显示如下,从原始图像开始,然后是使用像素复制进行4倍放大的区域,接着是使用双线性插值进行4倍放大的区域,最后是使用Lanczos卷积进行4倍放大的区域。Lanczos卷积的优势在于保持良好的对比度,同时避免了过于像素化的外观。

Brute Force PNG Image Sizing Coming in IDL 8.6 - Repeating Timers