面向python,Opencv学习笔记(二)---5

前言

要求opencv版本4.1.2.30(4.x >=版本),我的版本4.5.3

一、图像金字塔

图像金字塔是通过多个分辨率表示图像的一种有效且简单的结构。一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像。图像金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率表示。

1.高斯金字塔

高斯金字塔是指通过下采样不断地将图像尺寸缩小,进而在金字塔中包含多个尺度的图像。
在这里插入图片描述
Opencv4提供了cv.pyrDown()实现下采样

dst = cv.pyrDown(src,dst,dstsize,borderType)
src:输入的待下采样的图像
dst:输出的下采样后的图像
dstsize:输出图像的尺寸,可以使用默认值(一半)
borderType:像素边界外推方法的标志

2.拉普拉斯金字塔

拉普拉斯金字塔与高斯金字塔相反,拉普拉斯金字塔是通过上层小尺寸的图像构建下层大尺寸的图像

拉普拉斯金字塔具有预测残差的作用,它需要与高斯金字塔联合使用

假设我们已经有一个高斯金字塔,对于其中第k层图像,首先通过下采样得到一幅长宽均缩小一半的图像,即高斯金字塔中的第k+1层或者不在高斯金字塔中,之后对这张图像进行上采样,将图像尺寸恢复到第k层图像的尺寸。最后求取高斯金字塔中第k层图像与经过上采样后得到的图像的差值图像,这幅插值图像就是拉普拉斯金字塔的第k层图像。
在这里插入图片描述

3.代码示例

import cv2 as cv
import sys

#构建高斯金字塔
def gauss_image(image):
    #设置下采样次数
    level = 3
    img = image.copy()
    gauss_images=[]
    gauss_images.append(G0)
    cv.imshow('Gauss_0',G0)
    for i in range(level):
        dst= cv.pyrDown(img)
        gauss_images.append(dst)
        cv.imshow('Gauss_{}'.format(i+1),dst)
        img =dst.copy()
    return gauss_images

#构建拉普拉斯金字塔
def laplian_image(image):
    gauss_images = gauss_image(image)
    level=len(gauss_images)
    for i in range(level-1,0,-1):
        expand=cv.pyrUp(gauss_images[i],dstsize=gauss_images[i-1].shape[:2])
        lpls = cv.subtract(gauss_images[i-1],expand) 
        cv.imshow('Laplacian_{}'.format(level-1),lpls)
    #为了构建最上面一层,需要进行下采样再进行上采样
    expand = cv.pyrUp(cv.pyrDown(gauss_images[3]),dstsize=gauss_images[3].shape[:2])
    lpls=cv.subtract(gauss_images[3],expand)
    cv.imshow('Laplacian_{}'.format(0),lpls)

if __name__=='__main__':
    G0=cv.imread('./chapter_3/lena.jpg')
    if G0 is None:
        print('Failed to read img')
        sys.exit()

    laplian_image(G0)
    cv.waitKey(0)
    cv.destroyAllWindows()

二.窗口交互操作

1.图像窗口滑动条

通过滑动滑动条,动态调节某些参数
cv.createTrackbar(trackbarname,winname,value,count,onChange,userdata)
trackbarname:滑动条名称
winname:在其中创建滑动条的窗口的名称
value:指向整数变量的指针
count:滑动条的最大值
onChange:每次滑动条更改位置时要调用的函数指针
userdata:传递给回调用函数的可选参数(默认为0)

1.2 CreateTrackbar.py代码示例:

import cv2 as cv
import numpy as np
import sys

def call_back_brightness(x):
    global value,img,img1
    value = cv.getTrackbarPos('brightness','Brighter')
    img1=np.uint8(np.clip((value/100*img),0,255))

if __name__=='__main__':
    img = cv.imread('./chapter_3/lena.jpg')
    img1 = img.copy()

    cv.namedWindow('Brighter')
    #设置滑动条的初始位值为100
    value=100
    cv.createTrackbar('brightness','Brighter',value,300,call_back_brightness)

    while True:
        cv.imshow('Brighter',img1)
        if cv.waitKey(1)==ord('q'):
            break
    cv.destroyAllWindows()

1.3 结果展示:

在这里插入图片描述
在这里插入图片描述

三.鼠标的响应

1.函数

通过鼠标标记出重要的区域
cv.setMouseCallback(winname,onMouse,userdata)
winname:在其中添加鼠标响应的窗口的名称
onMouse:鼠标响应的回调函数
userdata:传递给回调函数的可选参数

回调函数中鼠标响应事件的可选标志:
在这里插入图片描述
回调函数中鼠标响应标志:
在这里插入图片描述

2.代码:

import cv2 as cv
import sys

def draw(event,x,y,flags,param):
    global img,pre_pts

    #鼠标右键按下:
    if event ==cv.EVENT_RBUTTONDOWN:
        print('请点击鼠标左键进行轨迹绘制')

    #鼠标左键按下
    if event==cv.EVENT_LBUTTONDOWN:
        pre_pts=(x,y)
        print("轨迹起始坐标为:{},{}".format(x,y))

    if event==cv.EVENT_MOUSEMOVE and flags==cv.EVENT_FLAG_LBUTTON:
        pts=(x,y)
        img=cv.line(img,pre_pts,pts,(0,0,255),2,5,0)
        pre_pts=pts
        cv.imshow('image',img)

if __name__=='__main__':
    img=cv.imread('./chapter_3/lena.jpg')
    img1=img.copy()
    pre_pts=-1,-1
    cv.imshow('image',img)
    cv.setMouseCallback('image',draw)
    cv.waitKey(0)
    cv.destroyAllWindows()

3.运行结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值