要求opencv版本4.1.2.30(4.x >=版本),我的版本4.5.3
图像金字塔是通过多个分辨率表示图像的一种有效且简单的结构。一个图像金字塔是一系列以金字塔形状排列的分辨率逐步降低的图像。图像金字塔的底部是待处理图像的高分辨率表示,而顶部是低分辨率表示。
高斯金字塔是指通过下采样不断地将图像尺寸缩小,进而在金字塔中包含多个尺度的图像。
Opencv4提供了cv.pyrDown()实现下采样
dst = cv.pyrDown(src,dst,dstsize,borderType)
src:输入的待下采样的图像
dst:输出的下采样后的图像
dstsize:输出图像的尺寸,可以使用默认值(一半)
borderType:像素边界外推方法的标志
拉普拉斯金字塔与高斯金字塔相反,拉普拉斯金字塔是通过上层小尺寸的图像构建下层大尺寸的图像
拉普拉斯金字塔具有预测残差的作用,它需要与高斯金字塔联合使用
假设我们已经有一个高斯金字塔,对于其中第k层图像,首先通过下采样得到一幅长宽均缩小一半的图像,即高斯金字塔中的第k+1层或者不在高斯金字塔中,之后对这张图像进行上采样,将图像尺寸恢复到第k层图像的尺寸。最后求取高斯金字塔中第k层图像与经过上采样后得到的图像的差值图像,这幅插值图像就是拉普拉斯金字塔的第k层图像。
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()
通过滑动滑动条,动态调节某些参数
cv.createTrackbar(trackbarname,winname,value,count,onChange,userdata)
trackbarname:滑动条名称
winname:在其中创建滑动条的窗口的名称
value:指向整数变量的指针
count:滑动条的最大值
onChange:每次滑动条更改位置时要调用的函数指针
userdata:传递给回调用函数的可选参数(默认为0)
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()
通过鼠标标记出重要的区域
cv.setMouseCallback(winname,onMouse,userdata)
winname:在其中添加鼠标响应的窗口的名称
onMouse:鼠标响应的回调函数
userdata:传递给回调函数的可选参数
回调函数中鼠标响应事件的可选标志:
回调函数中鼠标响应标志:
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()