栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

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

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Opencv学习笔记
  • 前言
  • 一、图像金字塔
    • 1.高斯金字塔
    • 2.拉普拉斯金字塔
    • 3.代码示例
  • 二.窗口交互操作
    • 1.图像窗口滑动条
    • 1.2 CreateTrackbar.py代码示例:
    • 1.3 结果展示:
  • 三.鼠标的响应
    • 1.函数
    • 2.代码:
    • 3.运行结果:

前言

要求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.运行结果:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/530197.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号