执行透视变形时,如何避免图像的一部分被切割?

问题描述

我正在尝试旋转图像的透视图,以便获得可以提供正视图透视图的结果。我正在使用cv2.WarpPerspective函数。但是,执行扭曲时,图像的某些部分会被剪切掉。如何避免这种情况?我认为的一个选择是找到图像特定部分的转换矩阵,然后将该矩阵应用于整个图像。但是,该方法未取得令人满意的结果。

我正在使用的代码是:

    import numpy as np
    import cv2
    from google.colab.patches import cv2_imshow
    img = cv2.imread("drive/My Drive/Images_for_Adarsh/DSC_0690.JPG")

    height,width = 1000,1500
    img = cv2.resize(img,(width,height))

    pts1 = np.float32([[ 250,0],[1220,300],[1300,770],[ 250,860]])
    pts2 = np.float32([[0,[width,height],[0,height]])
    matrix = cv2.getPerspectiveTransform(pts1,pts2)


    print(matrix.shape)
    print(matrix)
    imgOutput = cv2.warpPerspective(img,matrix,height))
    cv2_imshow(imgOutput)
    cv2.imwrite("drive/My Drive/PerspectiveWarp-Results1/0690_coarse/0690([[ 250,860]]).JPG",imgOutput)

输入图像:

The input image:

变形的图像:

The warped image:

解决方法

这是在Python / OpenCV中扭曲图像并添加额外空间的一种简单方法,该空间将包含更多输入,但输入外部的区域将保持透明。

输入:

enter image description here

import numpy as np
import cv2

# read input
img = cv2.imread("building.jpg")

# resize
height,width = 1000,1500
img = cv2.resize(img,(width,height))

# specify conjugate coordinates and shift output on left and top by 500
pts1 = np.float32([[ 250,0],[1220,300],[1300,770],[ 250,860]])
pts2 = np.float32([[+500,+500],[width+500,height+500],[+500,height+500]])

# compute perspective matrix
matrix = cv2.getPerspectiveTransform(pts1,pts2)

print(matrix.shape)
print(matrix)

# convert image to BGRA with opaque alpha
img = cv2.cvtColor(img,cv2.COLOR_BGR2BGRA)

# do perspective transformation setting area outside input to transparent
# extend output size so extended by 500 all around
imgOutput = cv2.warpPerspective(img,matrix,(width+1000,height+1000),cv2.INTER_LINEAR,borderMode=cv2.BORDER_CONSTANT,borderValue=(0,0))

# resize output,since it is too large to post
imgOutput = cv2.resize(imgOutput,height))
    
# save the warped output
cv2.imwrite("building_warped.png",imgOutput)

# show the result
cv2.imshow("result",imgOutput)
cv2.waitKey(0)
cv2.destroyAllWindows()

enter image description here

注意:应该可以使用矩阵将输入角投影到输出域,并计算所需的输出大小以容纳所有扭曲的输入。