Ошибка при наложении двух изображений в OpenCV и/или PIL

Я пробовал накладывать два изображения в openCV как в openCV, так и в PIL, но безрезультатно. Я использую массив 1000x1000x3 из np.zeros для фона (он же черный фон) и этого случайного изображение моего монитора, но я действительно не могу заставить его работать по какой-то неизвестной мне причине.

Попытка только с OpenCV: (результат(если вы обратите внимание, вы можете увидеть пару странных строк и точки посередине))

base_temp = np.zeros((1000,1000,3))
foreground_temp = cv2.imread('exampleImageThatILinkedAbove.png')

base_temp[offset_y:offset_y+foreground_temp.shape[0], offset_x:offset_x+foreground_temp.shape[1]] = foreground_temp

Попытка с PIL: (результат буквально такой же, как и версия OpenCV)

base_temp = cv2.convertScaleAbs(self.base)   #Convert to uint8 for cvtColor
base_temp = cv2.cvtColor(base_temp, cv2.COLOR_BGR2RGB)   #PIL uses RGB and OpenCV uses BGR
base_temp = Image.fromarray(base_temp)    #Convert to PIL Image
foreground_temp = cv2.cvtColor(cv2.convertScaleAbs(self.last_img), cv2.COLOR_BGR2RGB)
foreground_temp = Image.fromarray(foreground_temp)
base_temp.paste(foreground_temp, offset)

Я использую python3.5 и OpenCV3.4 в Windows 10, если это поможет.

Я хотел бы избегать любых решений, которые требуют сохранения изображений cv2, а затем перезагрузки их в другом модуле для их преобразования, но если это неизбежно, это тоже нормально. Любая помощь будет оценена по достоинству!


person SSBakh    schedule 14.10.2018    source источник
comment
И что вы ожидаете получить в результате изображения?   -  person Dmitrii Z.    schedule 14.10.2018
comment
@DmitriiZ. foreground_temp прямо в середине base_temp -- или, по крайней мере, вставлено в середину base_temp в соответствии с предоставленным смещением   -  person SSBakh    schedule 14.10.2018


Ответы (1)


Если вы проверите тип base_temp, вы увидите, что это float64, и это вызовет у вас проблемы, когда вы попытаетесь сохранить его как JPEG, который ожидает 8-битных значений без знака.

Таким образом, решение состоит в том, чтобы создать образ base_temp с правильным типом:

base_temp = np.zeros((1000,1000,3), dtype=np.uint8)    

Полный код и результат выглядят так:

import cv2
import numpy as np
from PIL import Image

# Make black background - not square, so it shows up problems with swapped dimensions
base_temp=np.zeros((768,1024,3),dtype=np.uint8)
foreground_temp=cv2.imread('monitor.png')

# Paste with different x and y offsets so it is clear when indices are swapped
offset_y=80
offset_x=40
base_temp[offset_y:offset_y+foreground_temp.shape[0], offset_x:offset_x+foreground_temp.shape[1]] = foreground_temp

Image.fromarray(base_temp).save('result.png')

введите здесь описание изображения

person Mark Setchell    schedule 14.10.2018
comment
Спасибо за ответ, но я делаю это в строке cv2.convertScaleAbs в примере с PIL — вот почему это там. - person SSBakh; 14.10.2018
comment
Я имел в виду ваш первый пример. - person Mark Setchell; 14.10.2018
comment
Я попробовал ваше решение, но в итоге получил изображение, очень похожее на результаты, которые я привел выше: черный экран со странной линией и парой случайных пикселей. Я честно в тупике в этот момент. - person SSBakh; 15.10.2018
comment
Я могу только подозревать, что ваша установка неудачна и что вы переустанавливаете. Мой код прямолинеен, как показано и проверено на работоспособность. - person Mark Setchell; 15.10.2018
comment
Ну, черт. Я попробовал это на Ubuntu, и это сработало отлично, поэтому я приму ваш ответ. Есть ли причина, по которой установка могла закончиться таким образом, хотя она все еще относительно свежая? - person SSBakh; 17.10.2018