如何在保留长宽比的情况下调整python中的图像大小,并给定目标大小?

问题描述:

首先我的一部分感觉这是一个愚蠢的问题,对此感到遗憾。目前,我已经找到了计算最佳比例因子(目标像素数量的最佳宽度和高度,同时保留长宽比)的最准确方法,它正在迭代并选择最佳比例因子,但必须有更好的方法来做到这一点。如何在保留长宽比的情况下调整python中的图像大小,并给定目标大小?

一个例子:

import cv2, numpy as np 
img = cv2.imread("arnold.jpg") 

img.shape[1] # e.g. width = 700 
img.shape[0] # e.g. height = 979 

# e.g. Total pixels : 685,300 

TARGET_PIXELS = 100000 
MAX_FACTOR = 0.9 
STEP_FACTOR = 0.001 
iter_factor = STEP_FACTOR 
results  = dict() 

while iter_factor < MAX_RATIO: 
    img2 = cv2.resize(img, (0,0), fx=iter_factor, fy=iter_factor) 
    results[img2.shape[0]*img2.shape[1]] = iter_factor 
    iter_factor += step_factor 

best_pixels = min(results, key=lambda x:abs(x-TARGET_PIXELS)) 
best_ratio = results[best_pixels] 

print best_pixels # e.g. 99750 
print best_ratio # e.g. 0.208 

我知道有可能是一些错误躺在身边上面即代码出现在结果字典中没有检查现有的密钥,但我更关心的是一个不同的做法,我无法弄清楚拉格朗日优化问题,但对于一个简单的问题来说,这看起来相当复杂。有任何想法吗?

**编辑后应答**

要提供的代码,如果有人有兴趣的答案

import math, cv2, numpy as np 

# load up an image 
img = cv2.imread("arnold.jpg") 

TARGET_PIXEL_AREA = 100000.0 

ratio = float(img.shape[1])/float(img.shape[0]) 
new_h = int(math.sqrt(TARGET_PIXEL_AREA/ratio) + 0.5) 
new_w = int((new_h * ratio) + 0.5) 

img2 = cv2.resize(img, (new_w,new_h)) 
+0

嗯这个代码不保持我的宽高比...如果我提供例如宽屏图像,它延伸它垂直,以填补一个正方形的TARGET_PIXEL_AREA – BigBoy1337

这里是我的方法,

aspectRatio = currentWidth/currentHeight 
heigth * width = area 

所以,

height * (height * aspectRatio) = area 
height² = area/aspectRatio 
height = sqrt(area/aspectRatio) 

那时我们知道目标身高了,width = height * aspectRatio

例:

area = 100 000 
height = sqrt(100 000/(700/979)) = 373.974 
width = 373.974 * (700/979) = 267.397 
+0

感谢的大小,是啊,这就是我正在寻找愚蠢的我现在看起来很简单! – user3102241