use*_*241 6 python math opencv
首先,我觉得这是一个愚蠢的问题,抱歉.目前,我发现计算最佳比例因子(目标像素数的最佳宽度和高度,同时保持纵横比)的最准确方法是迭代并选择最佳比例,但必须有更好的方法.
一个例子:
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
Run Code Online (Sandbox Code Playgroud)
我知道有可能是一些错误在上面,即代码躺在身边有在结果字典中没有检查现有的密钥,但我更关心的是一种不同的方法,我想不出正在调查拉格朗日优化,但似乎相当复杂也是一个简单的问题.有任何想法吗?
**编辑后编辑**
如果有人对答案感兴趣,将提供代码
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))
Run Code Online (Sandbox Code Playgroud)
Joa*_*ant 10
这是我的方法,
aspectRatio = currentWidth / currentHeight
heigth * width = area
Run Code Online (Sandbox Code Playgroud)
所以,
height * (height * aspectRatio) = area
height² = area / aspectRatio
height = sqrt(area / aspectRatio)
Run Code Online (Sandbox Code Playgroud)
那时我们知道目标高度,和width = height * aspectRatio.
例如:
area = 100 000
height = sqrt(100 000 / (700/979)) = 373.974
width = 373.974 * (700/979) = 267.397
Run Code Online (Sandbox Code Playgroud)