资源简介
使用python+OpenCV实现多张图像拼接,完成拼接后进行图像黑边去除。里面代码每一行都有中文注释和附带的实验图像。
代码片段和文件信息
# 执行以下命令,在终端(cmd命令行)运行代码:
# python image_stitching.py --images images/scottsdale --output output.png --crop 1
# import the necessary packages
from imutils import paths
import numpy as np
import argparse
import imutils
import cv2
# 构造参数解析器并解析参数
ap = argparse.ArgumentParser()
ap.add_argument(“-i“ “--images“ type=str required=True
help=“path to input directory of images to stitch“)
ap.add_argument(“-o“ “--output“ type=str required=True
help=“path to the output image“)
ap.add_argument(“-c“ “--crop“ type=int default=0
help=“whether to crop out largest rectangular region“)
args = vars(ap.parse_args()) # vars函数是实现返回对象object的属性和属性值的字典对象
print(args) # {‘images‘: ‘images/scottsdale‘ ‘output‘: ‘output.png‘ ‘crop‘: 1}
# 匹配输入图像的路径并初始化我们的图像列表
# rectangular_region = 2
print(“[INFO] loading images...“)
# 获取到每张待拼接图像并排序,如[‘第一张图片路径‘, 第二张图片路径‘,第三张图片路径‘]
imagePaths = sorted(list(paths.list_images(args[“images“])))
# print(imagePaths)
# imagePaths = [‘IMG_1786-2.jpg‘
# ‘IMG_1787-2.jpg‘
# ‘IMG_1788-2.jpg‘]
images = []
# 遍历图像路径,加载每个路径,然后将它们添加到我们的路径中图像到stich列表
for imagePath in imagePaths:
image = cv2.imread(imagePath)
images.append(image)
# 初始化OpenCV的图像sticher对象,然后执行图像拼接
print(“[INFO] stitching images...“)
stitcher = cv2.createStitcher() if imutils.is_cv3() else cv2.Stitcher_create()
(status stitched) = stitcher.stitch(images)
# print(status stitched)
# 如果状态为“0”,则OpenCV成功执行图像拼接
if status == 0:
# 检查我们是否应该从拼接图像中裁剪出最大的矩形区域
if args[“crop“] > 0:
# 在拼接图像周围创建一个10像素的黑色边框
print(“[INFO] cropping...“)
stitched = cv2.copyMakeBorder(stitched 10 10 10 10
cv2.BORDER_CONSTANT (0 0 0))
# cv2.imshow(‘123‘stitched)
# 将拼接图像转换为灰度
gray = cv2.cvtColor(stitched cv2.COLOR_BGR2GRAY)
# cv2.imshow(‘456‘ gray)
# 对灰度图像进行阈值二值化,
# 这样所有大于零的像素都设置为255(前景),而其他所有像素都保持为0(背景)
thresh = cv2.threshold(gray 0 255 cv2.THRESH_BINARY)[1]
# cv2.imshow(‘789‘ thresh)
# 在阈值图像中找到所有外部轮廓,然后找到 “最大 ”轮廓,它将是拼接图像的轮廓
# cv2.RETR_EXTERNAL:只找外轮廓。cv2.CHAIN_APPROX_SIMPLE:输出少量轮廓点
# 输出参数1:图像
# 输出参数2:轮廓列表
# 输出参数3:层级
cnts = cv2.findContours(thresh.copy() cv2.RETR_EXTERNAL cv2.CHAIN_APPROX_SIMPLE)
# print(cnts) #cnts包括三个数组:
# print(len(cnts))
cnts = imutils.grab_contours(cnts)
################################
# imutils.grab_contours 的源码 :
# # if the length the contours tuple returned by cv2.findContours
# # is ‘2‘ then we are using either OpenCV v2.4 v4-beta or
# # v4-official
# if len(cnts) == 2:
# cnts = cnts[0]
# # if the length of the contours tuple is ‘3‘ then we are using
# # either OpenCV v3 v4-pre or v4-alpha
# elif len(cnts) == 3:
# cnts = cnts[1]
# # otherwise OpenCV ha
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2019-03-26 11:10 图像拼接---去除黑边\
文件 160834 2018-12-11 19:45 图像拼接---去除黑边\IMG_1786-2.jpg
文件 155549 2018-12-11 19:45 图像拼接---去除黑边\IMG_1787-2.jpg
文件 187918 2018-12-11 19:45 图像拼接---去除黑边\IMG_1788-2.jpg
文件 7055 2019-03-26 11:12 图像拼接---去除黑边\image_stitching.py
目录 0 2019-03-18 08:40 图像拼接---去除黑边\images\
目录 0 2019-03-18 08:41 图像拼接---去除黑边\images\scottsdale\
文件 160834 2018-12-11 19:45 图像拼接---去除黑边\images\scottsdale\IMG_1786-2.jpg
文件 155549 2018-12-11 19:45 图像拼接---去除黑边\images\scottsdale\IMG_1787-2.jpg
文件 187918 2018-12-11 19:45 图像拼接---去除黑边\images\scottsdale\IMG_1788-2.jpg
文件 1059139 2018-12-11 20:10 图像拼接---去除黑边\output.png
目录 0 2019-03-26 11:12 图像拼接---去除黑边\result\
文件 234097 2019-03-25 21:37 图像拼接---去除黑边\result.jpg
评论
共有 条评论