為了便於比對圖像處理前後的效果,特別是算法處理前後的效果圖,我們需要同時顯示多張圖片。這裡采用opencv圖像拼接的方法來實現我們想要的效果。
定義圖片顯示函數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類型,圖像間隔區的顏色。
該函數兼容了不同尺寸圖片同時顯示。
# -*- 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)
測試結果如下圖所示:
更多三維、二維感知算法和金融量化分析算法請關注“樂樂感知學堂”微信公眾號,並將持續進行更新。