第六节:图像的水平堆叠,图像的纵向堆叠,图像窗口大小的调整,图像的多层堆叠
(一)图像的水平堆叠(np.hstack)
这需要使用到numpy数组的堆叠功能,因为图像本身就是矩阵。需要使用到np.hstack()函数,在这之前,我们已经使用过该函数
import cv2
import numpy as np
img = cv2.imread('lena.png')
Horizon = np.hstack((img,img))#水平堆叠2张图片
Horizon1 = np.hstack((img,img,img))#水平堆叠3张图片
cv2.imshow("Horizon",Horizon)
cv2.imshow("Horizon1",Horizon1)
cv2.waitKey(0)
(二)图像窗口大小的调整(cv2.namedWindow)
正如你所看见的,我们如果堆叠的图片再多一点,图片将会超过屏幕,所以我们需要调整窗口的大小,这里我们需要使用到cv2.nameWindow()函数(之前有提到过)
cv2.namedWindow(‘窗口标题’,参数)
参数有三个,如下:
cv2.WINDOW_AUTOSIZE 窗口大小不可变
cv2.WINDOW_NORMAL 窗口大小可以改变(然后用鼠标改变窗口的大小)
cv2.WINDOW_FREERATIO 窗口大小自适应
cv2.WINDOW_KEEPRATIO 窗口大小保持比例不变(然后用鼠标改变窗口的大小)
注:这个函数的调用只需在cv2.imshow前执行一次
import cv2
import numpy as np
img = cv2.imread('lena.png')
Horizon = np.hstack((img,img))
Horizon1 = np.hstack((img,img,img))
cv2.imshow("Horizon",Horizon)
cv2.namedWindow('Horizon1',cv2.WINDOW_NORMAL)#这里我们使用这个参数,然后用鼠标改变窗口Horizon1的大小
cv2.imshow("Horizon1",Horizon1)
cv2.waitKey(0)
参数较多,就多试试吧
(三)图像的纵向堆叠(np.vstack)
这需要使用到numpy数组的堆叠功能,因为图像本身就是矩阵。需要使用到np.vstack()函数,在这之前,我们已经使用过该函数
这里竖直堆叠2张lena
import cv2
import numpy as np
img = cv2.imread('lena.png')
Vertical= np.vstack((img,img))
cv2.imshow("Vertical",Vertical)
cv2.waitKey(0)
如果你愿意,也可以使用窗口改变函数
(四)图像的多层堆叠(imagestack自定义函数)
以上的图像堆叠功能,有些缺陷,首先它只能堆叠通道数相同的图片,灰度图和彩图就不能进行堆叠,第二上面的函数只能进行水平或竖直堆叠,不能同时进行。当然这些功能matplotlib都能实现,下面要介绍的这个函数是别人自己定义的
上代码
import cv2
import numpy as np
###########################################################################################
def imagestack(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)
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('lena.png')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgStack = imagestack(0.5,([img,img,img],[img,gray,img]))
cv2.imshow("ImageStack",imgStack)
cv2.waitKey(0)
函数的内部我就不解释了,这个之前就说过了,我不解释里面的原理,只讲函数的调用,其实函数的内部也不难,都是python的基操+cv函数的调用。相信小伙伴看来代码应该就已掌握代码的调用了
(五)结语
学习opencv有很多的方法,我的建议是你可以加一些群,可以充分利用B站,CSDN,和百度。
在我的博客中,我不会讲解opencv的算法实现(当然我也不太会),我只会讲解一些函数的调用,不理解就多改一些参数,多尝试尝试,慢慢你就理解来。相信你总有一天可以说opencv不过“Ctrl+C,Crtl+V”
如果有什么错误的地方,还请大家批评指正,最后,希望小伙伴们都能有所收获。