Ошибка при наложении двух изображений в OpenCV и / или PIL - PullRequest
0 голосов
/ 14 октября 2018

Я пробовал накладывать два изображения в 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 и последующей их загрузки в другой модуль для их преобразования, но если это неизбежно, это тоже хорошо.Любая помощь будет оценена!

1 Ответ

0 голосов
/ 14 октября 2018

Если вы проверите тип 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')

enter image description here

...