Opencv之图像金字塔(笔记07)

Posted 月疯

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Opencv之图像金字塔(笔记07)相关的知识,希望对你有一定的参考价值。

概念:

图像金字塔;
一般情况下,我们要处理是一副具有固定分辨率的图像。但是有些情况下,我们需要对同一图像的不同分辨率的子图像进行处理。比如,我们要在一副图像中查找某个目标,比如脸,我们不知道目标在图像中的尺寸大小。这种情况下,我们需要创建一组图像,这些图像是具有不同分辨率的原始图像。我们把这组图像叫做图像金字塔(简单来说就是同一图像的不同分辨率的子图集合)。如果我们把最大的图像放在底部,最小的放在顶部,看起来像一座金字塔,故而得名图像金字塔。

 

高斯图像金字塔:

高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的。顶部图像中的每个像素值等于下一层图像中5个像素的高斯加权平均值。这样操作一次一个MxN的图像就变成了一个M/2xN/2的图像。所以这幅图像的面积就变成为原来图像面积的四分之一。连续进行这样的操作我们就会得到一个分辨率不断下降的图像金字塔我们可以使用函数cv2.pyrDown()和cv2.pyrUp()构建金字塔。
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像金字塔
def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()

def imread(image):
    image=cv2.imread(image)
    #把图像的BGR转换成RGB
    image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    return image
#高斯金字塔
image=imread('1.png')
for i in range(4):
    image=cv2.pyrDown(image)
    print(image.shape)
    show(image)

import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像金字塔
def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()

def imread(image):
    image=cv2.imread(image)
    #把图像的BGR转换成RGB
    image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    return image
#高斯金字塔
#降低分辨率
image=imread('1.png')
for i in range(4):
    image=cv2.pyrDown(image)
    print(image.shape)
    # show(image)


#高斯金字塔
#提高分辨率
for i in range(4):
    image=cv2.pyrUp(image)
    print(image.shape)
    show(image)

拉普拉斯金字塔:

 拉普拉斯金字塔可以由高斯金字塔计算得来的,公式如下: Li=Gi-pyrUp(Gi+1)   ,拉普拉斯金字塔的图像看起来就像边界图,其中很多像素都是0.

import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像金字塔
def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()

def imread(image):
    image=cv2.imread(image)
    #把图像的BGR转换成RGB
    image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    return image
#拉普拉斯金字塔
down_image1=cv2.pyrDown(image)
down_image2=cv2.pyrDown(down_image1)
up_image=cv2.pyrUp(down_image2)
print(image.shape)
print(down_image1.shape)
print(down_image2.shape)
print(up_image.shape)
laplacian=down_image1 - up_image
show(laplacian)

运行报错:

F:\\开发工具\\pythonProject\\tools\\venv\\Scripts\\python.exe F:/开发工具/pythonProject/tools/opencv/open13.py
(696, 1242, 3)
(348, 621, 3)
(174, 311, 3)
(348, 622, 3)
Traceback (most recent call last):
  File "F:\\开发工具\\pythonProject\\tools\\opencv\\open13.py", line 37, in <module>
    laplacian=down_image1 - up_image
ValueError: operands could not be broadcast together with shapes (348,621,3) (348,622,3) 

Process finished with exit code 1

提示:俩边维数不一样导致, shapes (348,621,3) (348,622,3) ,宽度一样高度少了1

M = np.ones((up_image.shape[0],up_image.shape[1]-1,3),dtype='uint8')
import numpy as np
import matplotlib.pyplot as plt
import cv2
#图像金字塔
def show(image):
    plt.imshow(image)
    plt.axis('off')
    plt.show()

def imread(image):
    image=cv2.imread(image)
    #把图像的BGR转换成RGB
    image=cv2.cvtColor(image,cv2.COLOR_BGR2RGB)
    return image

down_image1=cv2.pyrDown(image)
down_image2=cv2.pyrDown(down_image1)
up_image=cv2.pyrUp(down_image2)
M = np.ones((up_image.shape[0],up_image.shape[1]-1,3),dtype='uint8')
print(image.shape)
print(down_image1.shape)
print(down_image2.shape)
print(up_image.shape)
print(M.shape)
laplacian=down_image1 - M
show(laplacian)
F:\\开发工具\\pythonProject\\tools\\venv\\Scripts\\python.exe F:/开发工具/pythonProject/tools/opencv/open13.py
(696, 1242, 3)
(348, 621, 3)
(174, 311, 3)
(348, 622, 3)
(348, 621, 3)

维度一样了

效果展示:

 

 

 

 

 

 

 

 

以上是关于Opencv之图像金字塔(笔记07)的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV之图像金字塔

OpenCV之图像金字塔

OpenCV图像处理应用(面向Python)之图像金字塔

OpenCV图像处理应用(面向Python)之图像金字塔

OpenCV图像处理应用(面向Python)之图像金字塔

youcans 的 OpenCV 例程200篇185.图像金字塔之高斯金字塔