2016-07-29 15 views
0

Ich arbeite an dem Zusammenfügen mehrerer Bilder mit OpenCV. Es fängt an zu arbeiten, aber ich habe ein Problem mit einer Sache. Nach cv2.warpPerspective Bild hat eine "weiche" Grenzen, was bedeutet, dass berechnete Maske ein Pixel zu groß ist.Bildstichartefakt [OpenCV Python]

Mein Code:

# apply a perspective warp to stitch the images 
    # together 
    result = cv2.warpPerspective(imageA, H, 
     (imageA.shape[1] + imageB.shape[1], imageA.shape[0])) 

    # Now create a mask of logo and create its inverse mask also 
    img2gray = cv2.cvtColor(result,cv2.COLOR_BGR2GRAY) 
    ret, mask = cv2.threshold(img2gray, 0, 255, cv2.THRESH_BINARY) 
    mask_inv = cv2.bitwise_not(mask) 

    resizedB = np.zeros((result.shape[0],result.shape[1],3), np.uint8) 
    resizedB[0:imageB.shape[0], 0:imageB.shape[1]] = imageB 
    difference = cv2.bitwise_or(resizedB,result, mask=mask_inv) 

    result = cv2.add(result,difference) 
    cv2.imwrite('result .jpg', result) 

Ich hatte cv2.bitwise_or zu verwenden, da das Hinzufügen beider Bilder cv2.add macht es zu hell, die an der Verbindung eine fast schwarze Linie gemacht. Haben Sie eine Idee, wie Sie das beheben können? Vielleicht gibt es eine Möglichkeit, die Maske so zu modifizieren, dass sie 1 Pixel kleiner wird?

+0

Sie könnten eine Verlaufsmaske verwenden, wo der Übergang ist, mit anderen Worten, beiden Verbindungsseiten Mischen – Pedro

+0

Gibt es eine Möglichkeit, eine Verlaufsmaske mit Farbschwelle zu erhalten? Ich glaube nicht, dass es da ist. Kennen Sie einen anderen Weg, um eine Maske mit einem gegebenen Bild zu erhalten? – Ekci

+0

können Sie die Entfernung von der Bildgrenze ähnlich http://StackOverflow.com/Questions/37911062/How-to-Baint-the-Right-Alpha-Wert-to-Perfekt-blend-two-images/37918596# berechnen 37918596 und benutze das als Mischmaske – Micka

Antwort

0

Ich habe dieses Problem endlich gelöst, indem ich eine Kombination von wenigen logischen Operationen verwendet habe. Die Lösung wird im folgenden dargestellt:

h1,w1 = imageB.shape[:2] 
    h2,w2 = imageA.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) 
    # print("pts:", pts) 
    [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(imageA, Ht.dot(H), (xmax-xmin, ymax-ymin)) 

    resizedB = np.zeros((result.shape[0], result.shape[1], 3), np.uint8) 

    resizedB[t[1]:t[1]+h1,t[0]:w1+t[0]] = imageB 
    # Now create a mask of logo and create its inverse mask also 
    img2gray = cv2.cvtColor(result,cv2.COLOR_BGR2GRAY) 
    ret, mask = cv2.threshold(img2gray, 0, 255, cv2.THRESH_BINARY) 

    kernel = np.ones((5,5),np.uint8) 
    k1 = (kernel == 1).astype('uint8') 
    mask = cv2.erode(mask, k1, borderType=cv2.BORDER_CONSTANT) 

    mask_inv = cv2.bitwise_not(mask) 

    difference = cv2.bitwise_or(resizedB, resizedB, mask=mask_inv) 

    result2 = cv2.bitwise_and(result, result, mask=mask) 

    result = cv2.add(result2, difference)