摘要: 图像拼接是将同一场景的多个重叠图像拼接成较大的图像的一种方法,在医学成像、计算机视觉、卫星数据、军事目标自动识别等领域具有重要意义。结合边缘检测、角点检测等数字图像处理方法,完成图像矫正和拼接极具应用价值。
关键词: 边缘检测、图像拼接、数字图像处理
原理
框架组成
整体框架组成
程序后台程序采用Flask进行构建,结合React前端可视化框架,跟material-ui设计库,构建图像拼接与矫正应用平台。同时平台还尝试链接树莓派,实时展示摄得照片。(构建出的web服务平台如图3.1所示)
构建图像矫正程序
将图像上传至后台服务器,服务器需要根据图像进行处理,先需要将图像固定尺寸,后操作opencv对图像进行边缘检测。
边缘检测
def getCanny(image):
# 高斯模糊
binary = cv2.GaussianBlur(image, (3, 3), 2, 2)
# 边缘检测
binary = cv2.Canny(binary, 60, 240, apertureSize=3)
# 膨胀操作,尽量使边缘闭合
kernel = np.ones((3, 3), np.uint8)
binary = cv2.dilate(binary, kernel, iterations=1)
return binary
在边缘检测后适配原四边形点集,再进行四边形顶点排序,然后计算长宽,最后进行透视变换。
def getclipper(path):
image = cv2.imread(path)
ratio = 900 / image.shape[0]
img = resizeImg(image)
binary_img = getCanny(img)
max_contour, max_area = findMaxContour(binary_img)
boxes = getBoxPoint(max_contour)
boxes = adaPoint(boxes, ratio)
boxes = orderPoints(boxes)
# 透视变化
warped = warpImage(image, boxes)
return warped
构建图像拼接程序
解压缩图像,然后检测关键点并提取来自它们的局部不变描述符。并匹配两幅图像的之间的特征。所处理的图片则需要有一定的相似性。
M = self.matchKeypoints(kpsA, kpsB,
featuresA, featuresB, ratio, reprojThresh)
匹配特征
如果匹配为None,则没有足够的匹配的关键点用来创建全景图否则有足够的匹配的关键点,用透视图变换将图像拼接在一起)将两张图像放在同一张图的左右部分,最后返回输出可视化之后的图像。
应用平台具体实践
操作与交互
图像拼接
上传相关图片1,为随机寻找的示例群山左图(如图4.1所示),上传图片2,为随机寻找的示例群山右图(如图4.2所示),点击提交,即可所得到的图像拼接图(如图4.3所示)。
图像矫正
上传需要进行矫正的图片,图片采用实验过程中随机选取的纸张进行拍摄(如图4.4所示),点击提交后,即可所得到的经过矫正后的图片(如图4.5所示)。显然,经过矫正后的图片在文字的具体显示和画幅上的表现更好。
程序代码
由于代码比较多,放置在了csdn上供下载使用。