Создание мозаики миниатюр с помощью OpenCV 3 и numpy

Вопрос:

У меня есть список миниатюр одинакового размера, и я хочу показать их как мозаику с заданной шириной. Идея состоит в том, чтобы создать одиночное изображение для каждой строки с формой (thumb_height, thumb_width*width, 3) а затем объединить их все вместе, получив одно изображение. Теперь, если ширина не является делителем числа миниатюр, последняя строка пропускает некоторые изображения. Идея состоит в том, чтобы заполнить пробел черным заполнителем. Здесь код:

def show_images_mosaic(images, width):
rows = []
for i in range(0, len(images), width):
rows.append(np.concatenate(images[i: i + width], axis=1))

if len(rows) > 1:
last_row = rows[-1]

height = images[0].shape[0]
last_row_width = last_row.shape[1]
expected_width = rows[0].shape[1]

if last_row_width < expected_width:
filler = np.zeros((height, expected_width - last_row_width, 3))
rows[-1] = np.concatenate((last_row, filler), axis=1)
else:
filler = None

mosaic = np.concatenate(rows, axis=0)
cv2.imshow('Mosaic', mosaic)

for i, row in enumerate(rows):
cv2.imshow('Row' + str(i), row)

cv2.imshow('LastRowUnfilled', last_row)
if filler is not None:
cv2.imshow('Filler', filler)

cv2.waitKey(0)

Этот код отлично работает, если width является делителем числа миниатюр. Но по какой-то причине он ломается, когда я должен заполнить последний ряд. Странно то, что он не разбивает только последнюю строку, но он разбивает весь образ, и я действительно не могу понять, почему. Кроме того, правильно показаны одиночные строки, за исключением последнего, но вся мозаика сломана, как будто последняя строка влияет на все изображение.

Лучший ответ:

Я думаю, что ваша проблема может быть связана с тем, что ваши эскизы — это 8-битные изображения.

По умолчанию np.zeros создает массив типа np.float64. Поэтому, когда вы объединяете свой наполнитель с последней строкой, а затем со всей мозаикой, вы получаете массив, содержащий значения до 255, но с dtype=np.float64. OpenCV ожидает, что плавающие изображения будут находиться в диапазоне [0, 1].

Чтобы исправить это, объявите свой наполнитель следующим образом:

filler = np.zeros((height, expected_width - last_row_width, 3), dtype=np.uint8)

NB: Если вы сохраните свою мозаику на диск, вы не увидите проблемы. Это только imshow что сломано, если это действительно проблема.

Оцените статью
TechArks.Ru
Добавить комментарий