Смешивание изображений: прозрачные черные области

Я пытаюсь добавить шахматную доску к изображению, чтобы найти коэффициенты искажения. Однако, когда я использую функцию addWeighted(), черные области моей шахматной доски прозрачны.

Смешивание изображений: прозрачные черные области

Сначала я деформирую изображение шахматной доски с помощью функций findHomography() и warpPerspective().

Затем я пытаюсь добавить изображение сцены и искривленной шахматной доски вместе с addWeighted(). Что мне нужно сделать, чтобы он не был прозрачным?

Изменить код:

input_1 = cv2.imread('RV_CV_Assignment_3_image_1.jpg')
imageSize = input_1.shape[:2]

chessboard = cv2.imread('Chessboard.jpg')
boardSize = np.float32([[0,0],[3632,0],[0,2816],[3632,2816]])

# These are the corner coordinates for the chessboard in the image. For now I do this manually
cornersBoard1 = np.float32([[348,233],[2004,233],[291,1555],[2025,1555]])

homography1, status1 = cv2.findHomography(boardSize,cornersBoard1)
warpBoard1 = cv2.warpPerspective(chessboard, homography1, (imageSize[1], imageSize[0]))

imgChessboard1 = cv2.addWeighted(input_1, 1, warpBoard1, 1, 0)
cv2.namedWindow('Chessboard in image 1', cv2.WINDOW_NORMAL)
cv2.imshow('Chessboard in image 1',imgChessboard1)

Смешивание изображений: прозрачные черные области

Смешивание изображений: прозрачные черные области

Пожалуйста, опубликуйте два входных изображения и код. Ознакомьтесь с информационными руководствами в центр помощи (stackoverflow.com/help), в частности, «Как задать хороший вопрос» (stackoverflow.com/help/как спросить) и «Как создать минимальный воспроизводимый пример» (stackoverflow.com/help/минимально-воспроизводимый-пример).

fmw42 05.05.2022 17:34

Вы добавляете значения пикселей шахматной доски. Таким образом, добавление черных пикселей (0) не меняет основное изображение. Может быть, попробуйте умножать вместо сложения: docs.opencv.org/3.4/d2/de8/…

spkersten 05.05.2022 17:42

@spkersten А, теперь понятно. Приветствую друга, который сделал работу!

Schweini14 05.05.2022 18:37
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот один из способов сделать это в Python/OpenCV. Убедитесь, что ваше изображение «шахматной доски» имеет черный цвет, сопоставленный с 1, а не с 0. Затем в вашей деформации перспективы убедитесь, что фон, не являющийся изображением, окрашен как чисто черный, то есть 0. Затем используйте np.where, чтобы смешать два изображения.

Вот ваш код изменен соответствующим образом,

import cv2
import numpy as np

input_1 = cv2.imread('buildings.jpg')
imageSize = input_1.shape[:2]

chessboard = cv2.imread('checks.png')
boardSize = np.float32([[0,0],[3632,0],[0,2816],[3632,2816]])

# modify chessboard to map (0,0,0) to (1,1,1) so no pure black
chessboard[np.where((chessboard == [0,0,0]).all(axis=2))] = [1,1,1]

# These are the corner coordinates for the chessboard in the image. For now I do this manually
cornersBoard1 = np.float32([[348,233],[2004,233],[291,1555],[2025,1555]])

homography1, status1 = cv2.findHomography(boardSize,cornersBoard1)

# make sure background of warpParspective is pure black
warpBoard1 = cv2.warpPerspective(chessboard, homography1, (imageSize[1], imageSize[0]), borderMode=cv2.BORDER_CONSTANT, borderValue=(0,0,0))

# use np.where to blend the two images with the chessboard over the buildings
imgChessboard1 = np.where(warpBoard1==0, input_1, warpBoard1)

cv2.namedWindow('Chessboard in image 1', cv2.WINDOW_NORMAL)
cv2.imshow('Chessboard in image 1',imgChessboard1)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.imwrite('checkerboard_on_buildings.jpg', imgChessboard1)

Результат:

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