发布时间:2021-08-04 23:00:23编辑:run阅读(5138)
使用PIL,Scikit-image库通过采样和颜色量化来调整图像的大小。
采样是指对图像像素点的选择/拒绝,是一种空间操作,可以使用采样(上采样或下采样)来增大或者缩小图像。
上采样:为了增加图像的大小,需要对图像进行上采样,问题是新的大图像中会有一些像素在原来的小图像中没有对应的像素,这就需要猜测这些未知像素的值
聚合值,最近的一个或多个像素邻域值的平均值;
使用双线性或者三次插值的像素邻域的内插值;
from PIL import Image import matplotlib.pylab as pylab im = Image.open(r'D:\image_processing\jpgs\aa1.jpg') pylab.imshow(im) pylab.show()
原图:
基于最近邻的上采样可能会导致质量较差的输出图像,放大20倍效果
from PIL import Image import matplotlib.pylab as pylab im = Image.open(r'D:\image_processing\jpgs\aa1.jpg') im1 = im.resize((im.width*20, im.height*20), Image.NEAREST) pylab.figure(figsize=(10,10)) pylab.imshow(im1) pylab.show()
效果不太理想,使用PIL库的resize()函数放大了图像,输出的图像是像素化的(带有方块效应和锯齿状边缘),图像质量很差。要实现输出高质量图像,可以采用双线性或双三次插值等方法。
双线性插值。考虑到一个灰度图像,它基本上是一个整数网格中像素值的二维矩阵,为了对网格上任意点P的像素值进行插值,可以使用类似二维线性插值的方法。
使用PIL库的reszie()函数进行双线性插值
from PIL import Image import matplotlib.pylab as pylab im = Image.open(r'D:\image_processing\jpgs\aa1.jpg') im1 = im.resize((im.width*20, im.height*20), Image.BILINEAR) pylab.figure(figsize=(10,10)) pylab.imshow(im1) pylab.show()
双三次插值。双三次插值是在二维规则网格上插值数据点上三次插值的扩展。插值曲面比双线性插值或最邻插值得到的相应曲面光滑。双三次插值可以使用拉格朗日多项式,三次样条或三次卷积算法来完成。
使用PIL库的resize()函数进行双三次插值.
from PIL import Image import matplotlib.pylab as pylab im = Image.open(r'D:\image_processing\jpgs\aa1.jpg') im1 = im.resize((im.width*20, im.height*20), Image.BICUBIC) pylab.figure(figsize=(10,10)) pylab.imshow(im1) pylab.show()
可以看到调整后图像质量的提高。
下采样.
要缩小图像的尺寸,应对图像进行下采样。对于新的缩小图像中的每个像素,其中很多都源自原来的大图像。
原图:
下采样缩小图:
from PIL import Image import matplotlib.pylab as pylab im = Image.open(r'D:\image_processing\jpgs\abc_1.jpg') im1 = im.resize((im.width//5, im.height//5)) pylab.figure(figsize=(10,10)) pylab.imshow(im1) pylab.show()
可以看到图像中有一些在原始图像中不存在的黑色斑点或伪影--这种效果称为混叠,之所以发生混叠效果,通常是因为采样率比奈奎斯特速率小(像素太少了的缘故),因此避免混叠的一种方法是增加采样率,使其大于奈奎斯特速率。
抗混率。这里的问题在于输出中的一个像素对应于输入图像中的25个像素,但是只能对其中的某一单个像素值进行采样,应该采取对输入图像中的一小块区域求平均,并将平均值作为采样的方法,可通过ANTIALIAS(一个高质量的下采样滤波器)来实现。
from PIL import Image import matplotlib.pylab as pylab im = Image.open(r'D:\image_processing\jpgs\abc_1.jpg') im1 = im.resize((im.width//5, im.height//5), Image.ANTIALIAS) pylab.figure(figsize=(10,10)) pylab.imshow(im1) pylab.show()
抗混叠通常是在向下采样之前通过平滑图像(通过图像与低通滤波器的卷积)来完成的。
可使用scikit-image变换模块的具有抗混叠效果的rescale()函数来解决混叠问题
from skimage.io import imread from skimage.transform import rescale import matplotlib.pylab as pylab im = imread(r'D:\image_processing\jpgs\abc_1.jpg') im1 = im.copy() pylab.figure(figsize=(20,15)) for i in range(4): pylab.subplot(2, 2, i+1), pylab.imshow(im1, cmap='gray'), pylab.axis('off') pylab.title('image size = ' + str(im1.shape[1]) + 'x' + str(im1.shape[0])) im1 = rescale(im1, scale=0.5, multichannel=True, anti_aliasing=True) pylab.subplots_adjust(wspace=0.1, hspace=0.1) pylab.show()
47745
46237
37110
34627
29229
25886
24745
19863
19417
17909
5716°
6315°
5835°
5888°
6985°
5829°
5846°
6361°
6316°
7673°