OpenCV - day06 Image_Pyramids

119 阅读2分钟

图形金字塔

  • 高斯金字塔
  • 拉普拉斯金字塔

图像金字塔.PNG

  • 图像金字塔主要是为了缩小图像,便于之后的图像处理(特征提取:对每一层都进行特征提取后再汇总)

一、高斯金字塔:(上下和展示图像相反)

1. 向下采样方法(Downsize): 116[1464141624164624362464162416414641]\frac{1}{16}\left[\begin{array}{ccccc} 1 & 4 & 6 & 4 & 1 \\ 4 & 16 & 24 & 16 & 4 \\ 6 & 24 & 36 & 24 & 6 \\ 4 & 16 & 24 & 16 & 4 \\ 1 & 4 & 6 & 4 & 1 \end{array}\right]

  • Gi\mathrm{G}_{i}与高斯内核卷积
  • 将所有偶数行和列去除

2. 向上采样方法(Amplify):[10305696]>[10030000005609600000] \left[\begin{array}{ll} 10 & 30 \\ 56 & 96 \end{array}\right] -----> \left[\begin{array}{cccc} 10 & 0 & 30 & 0 \\ 0 & 0 & 0 & 0 \\ 56 & 0 & 96 & 0 \\ 0 & 0 & 0 & 0 \end{array}\right]

  • 先将图像在每个方向扩大为原来的两倍,新增的行和列以0填充
  • 使用先前同样的内核 (乘4) 与放大后的图像卷积,获得近似值
 import cv2
 import matplotlib
 import matplotlib.pyplot as plt #取别名(用于绘图展示)
 import numpy as np #取别名,下面是notepad专用,立即显示图像
 %matplotlib inline 
 def cv_show(name, img): #定义函数用于显示图片,此处name为窗口名,img为cv2调用imread方法的返回值
     cv2.imshow(name,img)
     cv2.waitKey(0)
     cv2.destroyAllWindows()
 ## 自定义插槽显示
 def plt_show(images, titles):
     for i in range(len(images)):
         plt.subplot( i + 351), # 前面是行数,后面是列数,i+1的值应该在 [1 - 行*列] 之间
         
         plt.imshow(cv2.cvtColor(images[i],cv2.COLOR_BGR2RGB), 'gray'),  
         #展示之前先进行通道转换,少了个,没有链接起来
         
         plt.title(titles[i])
         
 img = cv2.imread('Park.jpg')
 ​
 cv_show('Park', img)
 up = cv2.pyrUp(img)
 ​
 cv_show('Up', up)
 down = cv2.pyrDown(img)
 ​
 cv_show('Down', down)
 ## 利用自定义插槽显示对比显示
 ​
 plt_show([img, up, down], ['Origin', 'Up', 'Down'])
 ​

output_9_0.png

  • 对比图: 下面的对比图作了resize处理,实际上Up更大,Down更小

金字塔对比.PNG

 up_down = cv2.pyrUp(down)
 img.shape
(225, 162, 3)
up_down.shape
(226, 162, 3)
up_down = cv2.resize(up_down, (162, 225))
res = np.hstack([img, up_down])

cv_show('Compare' , res)
plt_show([img, up_down], ['Origin', 'Up_Down']) ## cv2.imshow显示数组,而自定义的plt_show显示单张

output_14_0.png

  • 对比图:

金字塔像素损失.PNG

3. 小整一手:对视频进行Canny边缘检测

vdo = cv2.VideoCapture('dfh.mp4')
# 检查文件是否打开正确
if vdo.isOpened():
    open, frame = vdo.read()
else:
    open = False
while open: # 若打开正常
    ret, frame = vdo.read() # 
    if frame is None:
        break
    if ret == True:
        # gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        # cv2.imshow('result',frame) #可以直接使用frame进行原彩显示
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        
        ## 整一手边缘检测:
        border = cv2.Canny(gray, 25, 50)
        # border = cv2.resize(border, (1600, 800))
        res = np.hstack([gray, border])
        cv2.imshow('Compare', res) 
        if cv2.waitKey(10) & 0xFF == 27: ##27是退出键Esc
            break
vdo.release() #释放视频
cv2.destroyAllWindows()

二、拉普拉斯金字塔

Li=GiPyrUp(PyrDown(Gi))L_{i}=G_{i}-\operatorname{PyrUp}\left(\operatorname{PyrDown}\left(G_{i}\right)\right)

download.png

  • L 是处理结果
  • G 是原始图像
 img = cv2.imread('Park.jpg')
 cv_show('Park', img)
 down = cv2.pyrDown(img)
 down_Up = cv2.pyrUp(down)
 down_Up = cv2.resize(down_Up,(162, 225))
 ​
 la = img - down_Up
 ​
 res = np.hstack([img, la])
 cv_show('Result', res)
 plt_show([img, la],['Origin','Laplacian'])

output_22_0.png

  • 对比图:

高斯金字塔.PNG