Установите разрешение без изменения соотношения сторон

Я хочу масштабировать некоторые изображения, и я хочу установить количество пикселей на определенное число. Например, если есть изображение с width=400px height=100, я могу масштабировать его на 0,5, чтобы установить разрешение 10000 пикселей. Но приведенный ниже код может создавать некоторые значения 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, это было бы здорово.

Вы понимаете, что прямоугольник с площадью 10000 пикселей может иметь только несколько размеров и соответствующих аспектов (100x100, 125x80, 200x50, 250x40, 400x25 и т. д.), А не произвольные аспекты?

MBo 13.09.2018 13:04

@MBo Да, я знаю. Поэтому я сказал, что не обязательно сохранять точно такое же соотношение. Это может немного измениться. но в этом примере разрешение должно быть 10000.

mcan 13.09.2018 13:11
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
72
2

Ответы 2

вы можете использовать параметры 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.

Спасибо, но вы не можете установить с ним конкретное разрешение (высота * ширина).

mcan 13.09.2018 13:09

Хороший ход, но если скорость input size = (300, 226) будет 0.3840476863212842, а на выходе будет (115, 87), разрешение будет (115x87) = 10005

mcan 13.09.2018 14:15

Составьте список соотношений, включая значения (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]

Другие вопросы по теме