2015-11-13 41 views
4

首先我的一部分感覺這是一個愚蠢的問題,對此感到遺憾。目前,我已經找到了計算最佳比例因子(目標像素數量的最佳寬度和高度,同時保留長寬比)的最準確方法,它正在迭代並選擇最佳比例因子,但必須有更好的方法來做到這一點。如何在保留長寬比的情況下調整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

回答

9

這裏是我的方法,

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

相關問題