Python PIL - 在不保持宽高比的情况下调整图像大小

时间:2015-10-29 23:20:33

标签: python image opencv video python-imaging-library

所以我有一个Python脚本,它将一堆图像放在一个文件夹中,并将它们放在一起组成数组(如this)。我还有另一个脚本,它采用视频的帧并将它们放在数组中。问题是,从视频中获取帧的那个在图像之间创建黑条。

以下是使用JPEGS的第一个脚本制作的正确图像Correct image made using JPEGS

以下是使用第二个脚本制作的错误图片,该脚本使用视频帧: Incorrect image made using video frames

以下是制作正确第一张图片的脚本:

import Image
import glob
import os


name = raw_input('What is the file name (excluding the extension) of your video that was converted using FreeVideoToJPGConverter?\n')
x_res = int(raw_input('What do you want the width of your image to be (in pixels)?\n'))
y_res = int(raw_input('What do you want the height of your image to be (in pixels)?\n'))
rows = int(raw_input('How many rows do you want?\n'))
columns = int(raw_input('How many columns do you want?\n'))

images = glob.glob('./' + name + ' (*)/' + name + '*.jpg')
new_im = Image.new('RGB', (x_res,y_res))
x_cntr = 0
y_cntr = 0

if not os.path.exists('./' + name + ' Output/'):
    os.makedirs('./' + name + ' Output/')


for x in xrange(0,len(images),1):
    if x%(rows*columns) == 0:
        new_im.save('./' + name + ' Output/' + str(x) + '.jpg')
        new_im = Image.new('RGB', (x_res,y_res))
        y_cntr = 0
        x_cntr = 0
        print str(round(100*(float(x)/len(images)), 1)) + "% Complete"
    elif x%rows == 0:
        x_cntr = 0
        y_cntr = y_cntr + y_res/columns
    elif x%1 == 0:
        x_cntr = x_cntr + x_res/rows
    im = Image.open(images[x])
    im = im.resize((x_res/rows + x_res%rows, y_res/columns + y_res%columns), Image.ANTIALIAS)
    new_im.paste(im, (x_cntr, y_cntr))

以下是使不正确的第二张图片的脚本:

import cv2, Image, os


name = raw_input('Video File (With Extension): ')
x_res = int(raw_input('Image Width (Pixels): '))
y_res = int(raw_input('Image Height (Pixels): '))
rows = int(raw_input('Number of Rows: '))
columns = int(raw_input('Number of Columns: '))


vidcap = cv2.VideoCapture(name)
success,im = vidcap.read()
frames = int(vidcap.get(cv2.CAP_PROP_FRAME_COUNT))
new_im = Image.new('RGB', (x_res, y_res))
x_cntr = 0
y_cntr = 0

print str(frames) + " Frames to Join"

if not os.path.exists('./' + name + ' Output/'):
    os.makedirs('./' + name + ' Output/')


for x in xrange(0,frames,1):
    if x%(rows*columns) == 0:
        new_im.save('./' + name + ' Output/' + str(x) + '.jpg')
        new_im = Image.new('RGB', (x_res,y_res))
        y_cntr = 0
        x_cntr = 0
        print str(round(100*(float(x)/frames), 1)) + "% Complete"
    elif x%rows == 0:
        x_cntr = 0
        y_cntr = y_cntr + y_res/columns
    elif x%1 == 0:
        x_cntr = x_cntr + x_res/rows
    success,cv2_im = vidcap.read()
    if success == True:
        cv2_im = cv2.cvtColor(cv2_im,cv2.COLOR_BGR2RGB)
        im = Image.fromarray(cv2_im)
        im = im.resize((x_res/rows + x_res%rows, y_res/columns + y_res%columns), Image.ANTIALIAS)
        new_im.paste(im, (x_cntr, y_cntr))
    elif success == False:
        new_im.save('./' + name + ' Output/' + str(x) + '.jpg')
        print str(round(100*(float(x)/frames), 1)) + "% Complete" #Why isn't this 100%, fix

正如您所看到的,这两个脚本中用于调整图像大小(以适应新的图像数组)的特定行完全相同

im = im.resize((x_res/rows + x_res%rows, y_res/columns + y_res%columns), Image.ANTIALIAS)

...除第一个脚本外,图像是从JPEG打开的,在第二个脚本中,图像是使用OpenCV2从视频帧中获取的。如果我用不同的视频尝试这个,同样的事情发生。 它调整大小,就好像我使用的是.thumbnail而不是.resize

所以为什么有不同的输出,即使它们是相同的脚本?

PS:我也不知道为什么jpeg脚本上的输出图像比视频脚本多,但这可能是FreeVideoToJPGConverter(一个软件)的错误;我不确定。

0 个答案:

没有答案