2016-07-29 13 views
0

OpenCVを使用して複数の画像を縫い合わせています。それは働き始めているが、私は1つのことに問題がある。 cv2.warpPerspectiveイメージの後に、 "柔らかい"ボーダーがあります。これは、計算されたマスクが大きすぎる1ピクセルであることを意味します。画像をステッチングする[OpenCV Python]

マイコード:

# 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) 

私はcv2.addを使用して、両方の画像を追加すると、接続時にほとんど黒のラインを作っている、それはあまりにも明るいなるためcv2.bitwise_orを使用する必要がありました。 これを修正する方法はありますか?マスクを1ピクセル小さくするためにマスクを変更する方法がありますか?

+0

あなたは、他の言葉で、両方の接続脇 – Pedro

+0

をブレンドし、遷移があるグラデーションマスクを使用することができ、色のしきい値を使用したグラデーションマスクを得るためにそこに方法は何ですか?私はそこにいるとは思わない。与えられた画像を使ってマスクを得る他の方法を知っていますか? – Ekci

+0

あなたはhttp://stackoverflow.com/questions/37911062/how-to-obtain-the-right-alpha-value-to-perfectly-blend-two-images/37918596#に似た画像の境界からの距離を計算することができます37918596それをブレンドマスクとして使う – Micka

答えて

0

私は最後に、いくつかの論理演算の組み合わせを使用してこの問題を解決しました。ソリューションは、以下の通りである:

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) 
関連する問題