如何在保留长宽比的情况下调整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))
答
这里是我的方法,
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
嗯这个代码不保持我的宽高比...如果我提供例如宽屏图像,它延伸它垂直,以填补一个正方形的TARGET_PIXEL_AREA – BigBoy1337