我目前正在通过基于图像中嵌入的二维条码的点执行透视变换来校正图像的透视。
我正在使用的代码如下,并且完美无缺。第一个函数是我发现的函数,用于计算变换所需的系数:
def find_coeffs(pa, pb):
matrix = []
for p1, p2 in zip(pa, pb):
matrix.append([p1[0], p1[1], 1, 0, 0, 0, -p2[0]*p1[0], -p2[0]*p1[1]])
matrix.append([0, 0, 0, p1[0], p1[1], 1, -p2[1]*p1[0], -p2[1]*p1[1]])
A = numpy.matrix(matrix, dtype=numpy.float)
B = numpy.array(pb).reshape(8)
res = numpy.dot(numpy.linalg.inv(A.T * A) * A.T, B)
return numpy.array(res).reshape(8), res
以下是应该进行转换的代码:
firstPagePath = readFile(imagePath, '0', jobid, 0, 300)
d_id, barcode_points = getIDFromBarcode(firstPagePath)
img = Image.open(imagePath)
width, height = img.size
top_x = min(barcode_points[0][0], barcode_points[1][0])
top_y = min(barcode_points[0][1], barcode_points[3][1])
bot_x = max(barcode_points[2][0], barcode_points[3][0])
bot_y = max(barcode_points[1][1], barcode_points[2][1])
new_points = [(top_x, top_y), (top_x, bot_y), (bot_x, bot_y), (bot_x, top_y)]
img.transform(img.size, Image.PERSPECTIVE, coeffs, Image.BICUBIC).save(imagePath)
代码可以正确转换图像,但它会将图像剪切为img.size定义的大小。我想在进行转换之前计算图像的结果大小,以便它不会剪辑。有什么想法吗?