scipy.ndimage.zoom

最临近插值

3x3的256级灰度图,也就是高为3个像素,宽也是三个像素的图像,每个像素的取值是0-255,代表该像素的亮度,255代表最亮,也就是白色,0代表最暗,即黑色。假设图像的像素矩阵如下图所示(这个原始图叫做源图,Source):

234 38 22
67  44 12
89  65 63

如果想把这幅图放大为4x4大小的图像,那么该怎么做呢?那么第一步肯定就是先把4x4矩阵画出来,然后要往这个空的矩阵里面填值,要填的值从哪里来呢?是从源图中来,好,先填写目标图最左上角的像素,坐标为(0, 0),那么该坐标对应源图中的坐标可以由如下公式得出:

srcX=dstX* (srcWidth/dstWidth) , srcY = dstY * (srcHeight/dstHeight)

套用公式,就可以找到对应的原图的坐标了(0*(3/4),0*(3/4))=>(0*0.75,0*0.75)=>(0,0),找到了源图的对应坐标,就可以把源图中坐标为(0,0)处的234象素值填进去目标图的(0,0)这个位置了。
寻找目标图中坐标为(1,0)的象素对应源图中的坐标,套用公式:(1*0.75,0*0.75)=>(0.75,0)
那么按照四舍五入的方法就得到坐标(1, 0),完整的 运算过程就是这样的:(1*0.75,0*0.75)=>(0.75,0)=>(1,0)那么就可以再填一个象素到目标矩阵中了,同样是把源图中坐标为(1,0)处的像素值38填入目标图中的坐标。

234 38 22 22
67 44 12 12
89 65 63 63
89 65 63 63

这种放大图像的方法叫做最临近插值算法,这是一种最基本、最简单的图像缩放算法,效果也是最不好的,放大后的图像有很严重的马赛克,缩小后的图像有很严重的 失真;效果不好的根源就是其简单的最临近插值方法引入了严重的图像失真,比如,当由目标图的坐标反推得到的源图的的坐标是一个浮点数的时候,采用了四舍五 入的方法,直接采用了和这个浮点数最接近的象素的值,这种方法是很不科学的,当推得坐标值为 0.75的时候,不应该就简单的取为1,既然是0.75,比1要小0.25 ,比0要大0.75 ,那么目标象素值其实应该根据这个源图中虚拟的点四周的四个真实的点来按照一定的规律计算出来的,这样才能达到更好的缩放效果。双线型内插值算法就是一种 比较好的图像缩放算法,它充分的利用了源图中虚拟点四周的四个真实存在的像素值来共同决定目标图中的一个像素值,因此缩放效果比简单的最邻近插值要好很多。

scipy.ndimage.zoom上采样与下采样

双线性插值将是order = 1
最临近插值的是order = 0
立方体是默认值(顺序=3)

import numpy as np
import scipy.ndimage

x = np.arange(64).reshape(8, 8)

print('Original array: ')
print(x)

print('Resampled by a factor of 2 with the nearest interpolation:')
print(scipy.ndimage.zoom(x, 2, order=0))

print('Resampled by a factor of 2 with bilinear interpolation: ')
print(scipy.ndimage.zoom(x, 2, order=1))

print('Resampled by a factor of 2 with cubic interpolation')
print(scipy.ndimage.zoom(x, 2, order=3))

print(‘Downsampled by a factor of 0.5 with default interpolation: ’)
print(scipy.ndimage.zoom(x, 0.5))

结果:
https://blog.csdn.net/qq_34690929/article/details/79895938

猜你喜欢

转载自blog.csdn.net/weixin_42018112/article/details/89331720