черные линии панорамы python opencv

Я работаю над панорамой с Python OpenCV. Может ли кто-нибудь показать мне, как избавиться от черных линий на моих окончательных изображениях? Я думаю, может быть, мне следует сначала проверить цвет, т.е. 0,0,0, прежде чем копировать его в изображение атласа, но я не совсем уверен, как это сделать.

def warpTwoImages(img1, img2, H):
    '''warp img2 to img1 with homograph H'''
    h1,w1 = img1.shape[:2]
    h2,w2 = img2.shape[:2]
    pts1 = np.float32([[0,0],[0,h1],[w1,h1],[w1,0]]).reshape(-1,1,2)
    pts2 = np.float32([[0,0],[0,h2],[w2,h2],[w2,0]]).reshape(-1,1,2)
    pts2_ = cv2.perspectiveTransform(pts2, H)
    pts = np.concatenate((pts1, pts2_), axis=0)
    [xmin, ymin] = np.int32(pts.min(axis=0).ravel() - 0.5)
    [xmax, ymax] = np.int32(pts.max(axis=0).ravel() + 0.5)
    t = [-xmin,-ymin]
    Ht = np.array([[1,0,t[0]],[0,1,t[1]],[0,0,1]]) # translate

    result = cv2.warpPerspective(img2, Ht.dot(H), (xmax-xmin, ymax-ymin))
    result[t[1]:h1+t[1],t[0]:w1+t[0]] = img1
    return result

Нажмите здесь, чтобы увидеть мой результат


person Free Tyler1    schedule 01.08.2016    source источник
comment
не могли бы вы поделиться своим решением, где именно вы добавили Amitay Nachmani код для лучшего понимания? Как я пытался перед обертыванием, также в начале, но выдавал мне ошибки, такие как неправильный тип ввода. Пожалуйста, поделитесь своим решением. Спасибо.   -  person ganesh    schedule 30.07.2021
comment
Я столкнулся с той же проблемой. Пожалуйста помоги. Спасибо   -  person ganesh    schedule 30.07.2021


Ответы (1)


Этот ответ зависит от функции warpPrespicteve для работы с RGBA. Вы можете попробовать использовать альфа-канал каждого изображения. Перед переносом преобразуйте каждое изображение в RGBA (см. код ниже), где альфа-канал будет равен 0 для черных линий, а для всех остальных пикселей — 255.

import cv2
import numpy as np

# Read img
img = cv2.imread('i.jpg')

# Create mask from all the black lines
mask = np.zeros((img.shape[0],img.shape[1]),np.uint8)
cv2.inRange(img,(0,0,0),(1,1,1),mask)
mask[mask==0]=1
mask[mask==255]=0
mask = mask*255

b_channel, g_channel, r_channel = cv2.split(img)

# Create a new image with 4 channels the forth channel Aplha will give the opacity for each pixel
newImage = cv2.merge((b_channel, g_channel, r_channel, mask))
person Amitay Nachmani    schedule 05.08.2016