Chapter 06:Joining Multiple Images to Display

  随着本专栏的学习,你可以快速的掌握如何使用Opencv,请注意更多的学习内容还请看官方文档,本专栏是为了给对于视觉方向比较感兴趣的新手所写,带领它们做好一个基础的框架,让他们快速学会如何通过这个框架调取函数做自己感兴趣的项目,同时我也正在更新我的Opencv项目实战专栏,你可以搭配着一起学习。

订阅此专栏, (2条消息) Opencv项目实战_夏天是冰红茶的博客-CSDN博客


这次我们要实现的效果是让让多张图片在一个窗口中显现,我们使用matplotlib,也可以实现,但今天我们自己创一个函数来实现这个功能,有的时候,我们在做实时检测时可以用到它,与原来进行对比。

先来开个小菜,比如,如果只是实现水平、垂直的合并,非常简单。我们只需要用到np.hstack和np.vstack来实现。

import cv2
import numpy as np
img = cv2.imread('Resources/lena.png')
img=cv2.resize(img,(0,0),None,0.5,0.5)

imgHor = np.hstack((img,img))
imgVer = np.vstack((img,img))
# 水平,垂直
cv2.imshow("Horizontal",imgHor)
cv2.imshow("Vertical",imgVer)

cv2.waitKey(0)

如果只有两个,无可厚非,但我们有时候,要面对四个、六个、八个就捉襟见肘了。我们需要封装一个函数,让他通过传入图像构成的列表,使其能够显示我们的窗口。

import cv2
import numpy as np


def stackImages(scale,imgArray):
    rows = len(imgArray)   #行
    cols = len(imgArray[0])    #列
    rowsAvailable = isinstance(imgArray[0], list)
    width = imgArray[0][0].shape[1]
    height = imgArray[0][0].shape[0]
    if rowsAvailable:
        for x in range ( 0, rows):
            for y in range(0, cols):
                if imgArray[x][y].shape[:2] == imgArray[0][0].shape [:2]:
                    imgArray[x][y] = cv2.resize(imgArray[x][y], (0, 0), None, scale, scale)
                    #输出图像的大小,输出图像为:None,fx:width方向的缩放比例,fy:height方向的缩放比例(scale)
                else:
                    imgArray[x][y] = cv2.resize(imgArray[x][y], (imgArray[0][0].shape[1], imgArray[0][0].shape[0]), None, scale, scale)
                if len(imgArray[x][y].shape) == 2:
                    imgArray[x][y]= cv2.cvtColor( imgArray[x][y], cv2.COLOR_GRAY2BGR)
        imageBlank = np.zeros((height, width, 3), np.uint8)
        hor = [imageBlank]*rows
        hor_con = [imageBlank]*rows
        for x in range(0, rows):
            hor[x] = np.hstack(imgArray[x])
        ver = np.vstack(hor)
    else:
        for x in range(0, rows):
            if imgArray[x].shape[:2] == imgArray[0].shape[:2]:
                imgArray[x] = cv2.resize(imgArray[x], (0, 0), None, scale, scale)
            else:
                imgArray[x] = cv2.resize(imgArray[x], (imgArray[0].shape[1], imgArray[0].shape[0]), None,scale, scale)
            if len(imgArray[x].shape) == 2:
                imgArray[x] = cv2.cvtColor(imgArray[x], cv2.COLOR_GRAY2BGR)
        hor= np.hstack(imgArray)
        ver = hor
    return ver

img = cv2.imread('Resources/lena.png')
imgGray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

imgStack = stackImages(0.5,([img,imgGray,img],[img,img,img]))
# imgHor = np.hstack((img,img))
# imgVer = np.vstack((img,img))
#水平,垂直
# cv2.imshow("Horizontal",imgHor)
# cv2.imshow("Vertical",imgVer)
cv2.imshow("ImageStack",imgStack)

cv2.waitKey(0)

在这里我们创建了一个stackImages(scale,imgArray),他用来接收图像的规模大小,以及传入需要合并图像的列表。其中的内容我觉得还是很清晰的,如果你不能明白这里也没有关系,因为你可以将它作为一个函数调用。

猜你喜欢

转载自blog.csdn.net/m0_62919535/article/details/127194489