最近在项目中由于图像不是网络的输入尺寸,需要进行resize,由于自己在图像插值算法不怎么了解,只有去调用某些库的函数,所以测试了opencv和PIL自带的resize函数的效果。我读取的图像是100x100大小的,想要resize成250x250,代码如下:
import cv2
from PIL import Image
from pylab import *
img_path = "xxx.jpg"
img1 = cv2.imread(img_path)
img1 = cv2.resize(img1,(250,250))
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB) #由于opencv打开图像是BGR顺序,我们在后面要使用matplotlib来显示图像,而其是RBG显示,故需要进行转换
img = Image.open(img_path)
img2 = img.resize((250,250))
img3 = img.resize((250,250),Image.ANTIALIAS) #加入Image.ANTIALIAS是PIL内置的一种插值算法
subplot(131)
title("opencv")
imshow(img1)
subplot(132)
title("PIL-default")
imshow(img2)
subplot(133)
title("PIL-Image.ANTIALIAS")
imshow(img3)
show()
输出结果如下:
如上图,很明显可以看出PIL默认的resize效果很差(中间),很多细节已经失真。加入Image.ANTIALIAS后,效果要比默认的好,但是在某些细节还是没有opencv默认的resize效果好。
这些具体的原因应该是插值算法的差异,后续需要进步一研究。