OpenCV-Python教程:图像金字塔

news/2024/7/21 3:55:08 标签: opencv, python, 图像处理

原文链接:http://www.juzicode.com/opencv-python-pyrup-pyrdown

返回Opencv-Python教程

图像金字塔是一系列图像的集合,就如下图所示,更高层图像尺寸更小,更底层图像尺寸更大,看起来就像一个金字塔一样:

图源:docs.opencv.org

1、pyrDown

这里的down是指图像变小,所以原始图像在金字塔的底部。

首先将当前层的图像和下面这个高斯核卷积:

这个高斯核的尺寸为5×5大小,所有元素的值加起来正好为256,最后再除以256,得到的加权和正好为1。其距离最中心越近数值越大,这正好和高斯平滑选择的高斯核类似。这个过程也类似于高斯平滑,从后面的例子也可以看到经过pyrDown()处理的图像变得更加模糊(平滑)。然后移除偶数行和偶数列,然后就能得到和原图相比是原图1/4大小的新的图像,在图像金字塔中就位于当前层的上一层。

接口形式:

cv2.pyrDown(src[, dst[, dstsize[, borderType]]]) ->dst 
  • 参数含义:
  • src:源图像;
  • dst:目标图像;
  • dstsize:缩放后目标图像的尺寸,必须满足std::abs(dsize.width*2 – ssize.width) <= 2 && std::abs(dsize.height*2 – ssize.height) <= 2
  • borderType:边界填充类型;

下面的例子中连续3次进行pyrDown:

import cv2
print('VX公众号: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)

img = cv2.imread('..\\messi5.jpg')
img_down = cv2.pyrDown(img,dstsize=(img.shape[1]//2,img.shape[0]//2))
img_down2 = cv2.pyrDown(img_down,dstsize=(img_down.shape[1]//2,img_down.shape[0]//2))
img_down3 = cv2.pyrDown(img_down2,dstsize=(img_down2.shape[1]//2,img_down2.shape[0]//2))
print('img.shape',img.shape)
print('img_down.shape',img_down.shape)
print('img_down2.shape',img_down2.shape)
print('img_down3.shape',img_down3.shape)
cv2.imshow('img',img)
cv2.imshow('img_down',img_down)
cv2.imshow('img_down2',img_down2)
cv2.imshow('img_down3',img_down3)
cv2.waitKey(0)

运行结果:

VX公众号: 桔子code / juzicode.com
cv2.__version__: 4.5.3
img.shape (342, 548, 3)
img_down.shape (171, 274, 3)
img_down2.shape (85, 137, 3)
img_down3.shape (42, 68, 3)

2、pyrUp

这里的up是指将图像的尺寸变大,所以原始图像位于图像金字塔的顶层。

首先将当前层图像的宽高扩大2倍,插入的行和列位于偶数行或偶数列,这些位置填充数值0;然后用和pyrDown一样的kernel和当前层的图像卷积,填充到刚才插入的行列中。

接口形式:

cv2.pyrUp(src[, dst[, dstsize[, borderType]]]) ->dst
  • 参数含义:
  • src:源图像;
  • dst:目标图像;
  • dstsize:缩放后目标图像的尺寸,必须满足std::abs(dsize.width – ssize.width*2) == dsize.width % 2 && std::abs(dsize.height – ssize.height*2) == dsize.height % 2
  • borderType:边界填充类型;

下面的例子中连续3次进行pyrUp,为了显示方便,这里原图用resize()进行了缩小:

import cv2
print('VX公众号: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)

img = cv2.imread('..\\messi5.jpg')
img = cv2.resize(img,None,fx=0.15,fy=0.15)#为了观察方便缩小原图
img_up = cv2.pyrUp(img,dstsize=(2*img.shape[1],2*img.shape[0]))
img_up2 = cv2.pyrUp(img_up,dstsize=(2*img_up.shape[1],2*img_up.shape[0]))
img_up3 = cv2.pyrUp(img_up2,dstsize=(2*img_up2.shape[1],2*img_up2.shape[0]))
print('img.shape',img.shape)
print('img_up.shape',img_up.shape)
print('img_up2.shape',img_up2.shape)
print('img_up3.shape',img_up3.shape)
cv2.imshow('img',img)
cv2.imshow('img_up',img_up)
cv2.imshow('img_up2',img_up2)
cv2.imshow('img_up3',img_up3)
cv2.waitKey(0)

运行结果:

VX公众号: 桔子code / juzicode.com
cv2.__version__: 4.5.3
img.shape (51, 82, 3)
img_up.shape (102, 164, 3)
img_up2.shape (204, 328, 3)
img_up3.shape (408, 656, 3)

扩展阅读:

  1. OpenCV-Python教程

http://www.niftyadmin.cn/n/787914.html

相关文章

Scala里面如何使用枚举

枚举通常用来定义已知数量的常量&#xff0c;比如月份&#xff0c;星期&#xff0c;季节等等&#xff0c;用过java的人都知道定义枚举的关键字是enum&#xff0c;在scala里面和java有所不同&#xff0c;来看一个完整的例子定义&#xff1a; object EnumTest {/**** 定义一个星…

wx小程序—— 小程序端与后台联调测试上传流程

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

你别耍我,0.1+0.2竟然不等于0.3?(浮点数的二进制表示)

原文链接&#xff1a;http://www.juzicode.com/computer-basis-float-point-binary 老规矩先举几个栗子&#xff1a; 第1个例子是单精度浮点数间的比较&#xff0c;定义了几个float型的变量&#xff1a; //juzicode.com / VX:桔子code //vs2015 #include "stdio.h"…

subwayProject update1

由于cache的使用是临时决定的&#xff0c;所以在实现时并没有完成模块化的设计&#xff0c;而是直接嵌入到了之前设计的类中&#xff0c;有大量的代码冗余。这次更新主要完成了cache的模块化&#xff0c;精简了不少代码&#xff0c;增加了重用性&#xff0c;同时也对cache模块的…

人工智能的三个阶段——规则阶段

QQ 1274510382 Wechat JNZ_aming 商业联盟 QQ群538250800 技术搞事 QQ群599020441 解决方案 QQ群152889761 加入我们 QQ群649347320 共享学习 QQ群674240731 纪年科技aming 网络安全 ,深度学习,嵌入式,机器强化,生物智能,生命科学。

Orcale常用函数

1.ascii 作用&#xff1a; 返回指定的字符对应的十进制数 select ascii&#xff08;A&#xff09; &#xff0c;ascii(a),ascii( ) from dual; 2.chr 作用&#xff1a;给出整数&#xff0c;返回对应的字符 select chr(65) ,chr(54780) from dual; 3.concat 作用&#xff1a;连接…

理解elasticsearch的parent-child关系

前面文章介绍了&#xff0c;在es里面的几种数据组织关系&#xff0c;包括array[object]&#xff0c;nested&#xff0c;以及今天要说的Parent-Child。 Parent-Child与Nested非常类似&#xff0c;都可以用来处理一对多的关系&#xff0c;如果多对多的关系&#xff0c;那就拆分成…

OpenCV-Python教程:图像梯度(Sobel,Scharr,Laplacian)

原文链接&#xff1a;http://www.juzicode.com/opencv-python-image-gradient 返回Opencv-Python教程 高斯平滑、双边平滑 和 均值平滑、中值平滑 介绍的平滑处理可以看做是图像的“低通滤波”&#xff0c;它会滤除掉图像的“高频”部分&#xff0c;使图像看起来更平滑&#x…