我有一张失真的图片,在没有失真的情况下,点A,B,C和D形成了一个1厘米*1厘米的正方形。

我试图使用单应性来纠正它,但它扭曲了AD和BC线,如图中所示。

你知道我该怎么纠正它吗?
非常感谢!
Marie-编码器初学者
PS:作为参考,图像是在带有内窥镜相机的管子中拍摄的,内窥镜相机具有很大的视野,几乎可以在相机周围拍摄管子的照片。我将使用1*1厘米的正方形来估计随着时间的推移拍摄的几张照片的根的生长。
下面是我的代码:
import cv2
import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__' :
# Read source image.
im_src = cv2.imread('points2.jpg', cv2.IMREAD_COLOR)
# Four points of the miniR image
pts_src = np.array([[742,223],[806,255],[818,507],[753,517]], dtype=float)
# Read destination image.
im_dst = cv2.imread('rectangle.jpg', cv2.IMREAD_COLOR)
# Four points of the square
pts_dst = np.array([[200,200],[1000,200],[1000,1000],[200,1000]], dtype=float)
# Calculate Homography
h, status = cv2.findHomography(pts_src, pts_dst)
# Warp source image to destination based on homography
im_out = cv2.warpPerspective(im_src, h, (im_dst.shape[1],im_dst.shape[0]))
cv2.imwrite('corrected2.jpg', im_out)
# Display images
cv2.imshow("Source Image", im_src)
cv2.imshow("Destination Image", im_dst)
cv2.imshow("Warped Source Image", im_out)
cv2.waitKey(0)发布于 2017-03-15 07:44:29
单应性是一种投影变换。因此,它只能将直线映射为直线。输入曲线四边形的直边被正确地校正,但是您无法使用投影变换来拉直曲线的边。
在你发布的照片中,可以合理地假设整个几何图形近似为一个圆柱体,并且“垂直”线平行于圆柱体的轴线。因此,它们大致是直的,并且投影变换(相机投影)将它们映射到直线。“水平”线是圆圈的图像,如果圆柱体被挤压,则是椭圆。投影变换将椭圆(特别是圆)映射为椭圆。所以你可以通过拟合椭圆来继续。有关提示,请参阅this other answer。
发布于 2019-08-30 22:24:51
我找到了一个使用GDAL的解决方案。我们可以使用两个棋盘图像。一张图像是用产生失真的设备成像的,并且保持不变-所以没有失真。在帮助QGIS的帮助下,您可以创建一个文件,将扭曲的点与未扭曲的点关联起来。为此,您可以使用定义的网格间隔(例如100px)在每个交叉点添加一个地面控制点,并将生成的GCP导出为pointsfile.points。
之后,您可以使用协作者创建的here批处理文件。它正在使用GDAL对图像进行地理校正。
您只需将想要转换的图像(jpg格式)放入存储库的根目录中,然后运行bash warp.sh。这会将重新转换的图像输出到out/目录中。
https://stackoverflow.com/questions/42792604
复制相似问题