Установите разрешение без изменения соотношения сторон - PullRequest
0 голосов
/ 13 сентября 2018

Я хочу масштабировать некоторые изображения, и я хочу установить количество пикселей для определенного числа.Например, если есть изображение с width=400px height=100, я могу масштабировать его на 0,5, чтобы установить разрешение 10000px. Но приведенный ниже код может выдавать некоторые значения new_width * new_height, такие как 9999 или 10001, некоторые другие значения ширины и высоты.Общее количество пикселей должно быть 10000.

import os
import cv2

TOTAL_PIXEL_NUMBER = 10000

path = 'path/to/images/folder'
for img in os.listdir(path):
    try:
        img_array = cv2.imread(os.path.join(path,img), cv2.IMREAD_GRAYSCALE)
        height, width = img_array.shape
        aspect_ratio = width/height
        new_height = np.sqrt(TOTAL_PIXEL_NUMBER/aspect_ratio)
        new_width = new_height * aspect_ratio
        new_array = cv2.resize(img_array, (new_width,new_height))
        data.append(new_array)
    except Exceptinon as e:
        print(e)

Я хочу сохранить соотношение, чтобы не искажать изображения.Но не обязательно оставаться «точно таким же».Например, если исходное соотношение составляет 0,35, оно может быть 0,36 или 0,34 в измененном изображении, чтобы общее число пикселей составило 10000. Но как выбрать оптимальное соотношение, чтобы сделать разрешение постоянным?Или, если для этого есть какая-то функция opencv, это было бы здорово.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Составьте список соотношений, включающих значения (10000/1, 5000/2, etc)

[10000, 2500, 625, 400, 156.25, 100, 39.065, 25, 16, 6.25, 4, 1.5625, 1...0.0001]

или готовые к использованию кортежи с соотношением, шириной и высотой:

[(10000, 10000, 1), (2500, 5000, 2), (625, 2500, 4) ...]

и инверсиями первой частиэтого списка.

Для заданного отношения w / h найдите ближайшее значение из списка и используйте соответствующие ширину и высоту, чтобы получить результирующий прямоугольник.

Например, у вас есть 300x200 изображение ссоотношение 1.5.Наилучшее значение - 1.5625, поэтому прямоугольник результата равен 125x80, а масштабные коэффициенты 125/300 и 80/200

l = []
for i in range(1, 10001):
    if (10000 % i == 0):
        w = i
        h = 10000 // i
        r = w / h
        l.append((r, w, h))

ww, hh = 1920, 1080
rr = ww / hh
mn = 100000
for i in range(len(l)):
    cmn = max(rr / l[i][0], l[i][0] / rr)
    if (cmn < mn):
        bestidx = i
        mn = cmn

new_width = l[bestidx][1]
new_height = l[bestidx][2]
0 голосов
/ 13 сентября 2018

вы можете использовать параметры fx и fy, чтобы установить это.

#creating ratio
rate=1/np.sqrt(height*width/10000)
new_array = cv2.resize(img_array, (0,0), fx=rate, fy=rate)
#this will resize the image to 10000 pixels in 3 channels.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...