资源简介

使用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

评论

共有 条评论

相关资源