Я хочу масштабировать некоторые изображения, и я хочу установить количество пикселей на определенное число. Например, если есть изображение с 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, это было бы здорово.
@MBo Да, я знаю. Поэтому я сказал, что не обязательно сохранять точно такое же соотношение. Это может немного измениться. но в этом примере разрешение должно быть 10000.
вы можете использовать параметры 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.
Спасибо, но вы не можете установить с ним конкретное разрешение (высота * ширина).
Хороший ход, но если скорость input size = (300, 226)
будет 0.3840476863212842
, а на выходе будет (115, 87)
, разрешение будет (115x87) = 10005
Составьте список соотношений, включая значения (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]
Вы понимаете, что прямоугольник с площадью 10000 пикселей может иметь только несколько размеров и соответствующих аспектов (100x100, 125x80, 200x50, 250x40, 400x25 и т. д.), А не произвольные аспекты?