opencv-python 小白笔记(6)

(一)图像的水平堆叠(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”

如果有什么错误的地方,还请大家批评指正,最后,希望小伙伴们都能有所收获。

在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值