为了便于比对图像处理前后的效果,特别是算法处理前后的效果图,我们需要同时显示多张图片。这里采用opencv图像拼接的方法来实现我们想要的效果。
1 定义函数show_multi_img
定义图片显示函数show_multi_img,共包括5参数,各个参数的意义和类型分别如下:
(1)scale:float类型,图像缩放比例,即按比例对图像进行缩放。
(2)imglist:list类型,即待显示的图像数据组成的列表。
(3)order:list或tuple类型,指图像显示窗口的行和列,order[0]表示行,order[1]表示列。默认取值为1行N列,N为imglist的长度,即待显示图像的张数。
(4)border:int类型,即图像间最小的间隔大小。
(5)border:tuple类型,图像间隔区的颜色。
该函数兼容了不同尺寸图片同时显示。
2 示例代码
# -*- coding: utf-8 -*-
"""
乐乐感知学堂公众号
@author: https://blog.csdn.net/suiyingy
"""
import cv2
import numpy as np
def show_multi_imgs(scale, imglist, order=None, border=10, border_color=(255, 255, 0)):
"""
:param scale: float 原图缩放的尺度
:param imglist: list 待显示的图像序列
:param order: list or tuple 显示顺序 行×列
:param border: int 图像间隔距离
:param border_color: tuple 间隔区域颜色
:return: 返回拼接好的numpy数组
"""
if order is None:
order = [1, len(imglist)]
allimgs = imglist.copy()
ws , hs = [], []
for i, img in enumerate(allimgs):
if np.ndim(img) == 2:
allimgs[i] = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
allimgs[i] = cv2.resize(img, dsize=(0, 0), fx=scale, fy=scale)
ws.append(allimgs[i].shape[1])
hs.append(allimgs[i].shape[0])
w = max(ws)
h = max(hs)
# 将待显示图片拼接起来
sub = int(order[0] * order[1] - len(imglist))
# 判断输入的显示格式与待显示图像数量的大小关系
if sub > 0:
for s in range(sub):
allimgs.append(np.zeros_like(allimgs[0]))
elif sub < 0:
allimgs = allimgs[:sub]
imgblank = np.zeros(((h+border) * order[0], (w+border) * order[1], 3)) + border_color
imgblank = imgblank.astype(np.uint8)
for i in range(order[0]):
for j in range(order[1]):
imgblank[(i * h + i*border):((i + 1) * h+i*border), (j * w + j*border):((j + 1) * w + j*border), :] = allimgs[i * order[1] + j]
return imgblank
if __name__ == '__main__':
image = cv2.imread('lena.jpg')
img = show_multi_imgs(0.9, [image, image, image, image, image, image], (2, 3))
cv2.namedWindow('multi', 0)
cv2.imshow('multi', img)
cv2.waitKey(0)
3 测试效果
测试结果如下图所示:
更多三维、二维感知算法和金融量化分析算法请关注“乐乐感知学堂”微信公众号,并将持续进行更新。
扫描二维码关注公众号,回复:
14345807 查看本文章
