openCV,图像金字塔你学会了么?这些知识让你拿回去灵活使用!!!!

© Fu Xianjun. All Rights Reserved.

图像金字塔


图像金字塔分为高斯金字塔和拉普拉斯金字塔


一、理论基础

示例:图像金字塔是是同一图像不同分辨率的子图集合是通过原图像不断向下采样而产生的。通俗的说就是由高分辨率(大尺寸)图像产生低分辨率(小尺寸)图像。

二、pyrDown函数

1.作用

将图像向下采样后使图像的行列的数量都变成原来的二分之一,图像的整体大小变成原来的四分之一。并且会使图像分辨率降低。

语法形式代码如下:

dst= cv2.pyrDown(src[,dstsize[,borderType]])

•dst 为目标图像
•src为原始图像
•dstsize为目标图像大小
•borderType为边界类型,默认值为BORDER_DEFAULT,且只支持BORDER_DEFAULT

2.实例:

import cv2
import numpy as np   #导入两个包

img= cv2.imread("A.jpg")   #导入图像
cv2.imshow("alg",img)  
P1 = cv2.pyrDown(img)    #第一次向下采样
P2 = cv2.pyrDown(P1)     #第二次向下采样

cv2.imshow("P1"P1)      #显示图像
cv2.imshow("P1"P2)

cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
运行结果(有点吓人,不好意思。)
在这里插入图片描述


二、pyrUp函数

作用

很简单就是与pyrDown函数相似不过是使图向上采样后使图像的行列的数量都变成原来的两倍,图像的整体大小变成原来的四倍。但图像分辨率还是降低。

pyrUp函数不是pyrDown函数的逆运算!!!!!

实例

import cv2
import numpy as np   #导入两个包

img= cv2.imread("A.jpg")   #导入图像
cv2.imshow("alg",img)  
P1 = cv2.pyrUp(img)    #第一次向下采样
P2 = cv2.pyrUp(P1)     #第二次向下采样

cv2.imshow("P1"P1)      #显示图像
cv2.imshow("P1"P2)

cv2.waitKey(0)
cv2.destroyAllWindows()
           运行结果可能引起大家不适我就不显示了。

三、拉普拉斯金字塔

定义

前面说过pyrUp函数不是pyrDown函数的逆运算,因为向下采样时在使用高斯滤波器处理后还要抛弃偶数行列,不可避免的要丢失一些信息。
为了在向上采样时能恢复有较高分辨率的原始图像,就要获取采样过程中丢失的信息,这些信息就构成了拉普拉斯金字塔。

实例:将橘子与苹果“融合”

代码如下:

#将橘子与苹果合并
import cv2
import numpy as np

A = cv2.imread("apple.png")
A= cv2.resize(A,(512,512))
cv2.imshow("A",A)

B = cv2.imread("orange.png")
B= cv2.resize(B,(512,512))
cv2.imshow("B",B)


G=A.copy()#复制图像
gpA = [G]#定义列表 存储图像变量
for i in range(5):#循环5次
    G=cv2.pyrDown(G)#下采样
    gpA.append(G)#将下采样图像结果存入列表gpA
    
    
G=B.copy()#复制图像
gpB = [G]#定义列表 存储图像变量
for i in range(5):#循环5次
    G=cv2.pyrDown(G)#下采样
    gpB.append(G)#将下采样图像结果存入列表gpB

#生成拉普拉斯金字塔
lpA= [gpA[5]]
for i in range(5,0,-1):
    GE= cv2.pyrUp(gpA[i])
    L= cv2.subtract(gpA[i-1],GE)
    lpA.append(L)

lpB= [gpB[5]]
for i in range(5,0,-1):
    GE= cv2.pyrUp(gpB[i])
    L= cv2.subtract(gpB[i-1],GE)
    lpB.append(L)

#合并
LS= []
for la,lb in zip(lpA,lpB):
    h,w,c= la.shape
    
    ls= np.hstack((la[:,0:w//2],lb[:,w//2:w]))
    LS.append(ls)
    
#重构图像
ls_= LS[0]
for i in range(1,6):
    ls_=cv2.pyrUp(ls_)
    ls_=cv2.add(ls_,LS[i])

cv2.imshow("LS",ls_)    
        
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果:
在这里插入图片描述

四、泛红填充

import cv2
import numpy as np

img= cv2.imread("AM.png")
mask = np.zeros(img.shape[0]+2,img.shape[1]+2),dtype=np.uint8)
cv2.floodFill(img,mask,(140,140),(0,123,123),(50,50,50),(10,10,10),cv2.FLOODFILL_FIXED_RANGE)
cv2.imshow("A",img)

cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果(绿色区域原来为白色)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值