opencv图像金字塔python代码
时间: 2023-10-08 22:09:41 浏览: 181
下面是使用OpenCV实现图像金字塔的Python代码示例:
```python
import cv2
# 读取原始图像
img = cv2.imread('image.jpg')
# 构建高斯金字塔
G = img.copy()
gp = [G]
for i in range(6):
G = cv2.pyrDown(G)
gp.append(G)
# 构建拉普拉斯金字塔
lp = [gp[5]]
for i in range(5, 0, -1):
GE = cv2.pyrUp(gp[i])
L = cv2.subtract(gp[i-1], GE)
lp.append(L)
# 显示金字塔
cv2.imshow('Original Image', img)
for i in range(6):
cv2.imshow(f'Gaussian Pyramid {i}', gp[i])
for i in range(5):
cv2.imshow(f'Laplacian Pyramid {i}', lp[i])
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这段代码中,我们首先读取了一张原始图像,然后通过`cv2.pyrDown`函数构建了高斯金字塔,通过`cv2.subtract`函数和`cv2.pyrUp`函数构建了拉普拉斯金字塔。最后使用`cv2.imshow`函数显示金字塔。
相关问题
opencv形状匹配 金字塔 python
### 使用 Python 和 OpenCV 实现形状匹配
形状匹配是指通过比较两个图形之间的相似程度来识别目标物体的技术。OpenCV 提供了几种方法来进行形状匹配,其中最常用的是轮廓匹配和Hu矩。
#### 轮廓匹配
轮廓匹配主要依赖于`cv2.matchShapes()`函数,该函数可以通过计算不同形状间的距离来评估它们的相似性[^1]。
```python
import cv2
import numpy as np
def match_shapes(image_path, template_contour):
img = cv2.imread(image_path)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,binary = cv2.threshold(gray ,127,255,cv2.THRESH_BINARY)
contours,hierarchy=cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)[-2:]
for cnt in contours:
similarity = cv2.matchShapes(template_contour,cnt,1,0.0)
if(similarity<0.08): # 设置阈值判断是否匹配成功
print(f'Matched with score {similarity}')
break
template_img = cv2.imread('path_to_template_image')
_, _, template_contours, _= cv2.findContours(cv2.Canny(template_img, 50, 200),
cv2.RETR_EXTERNAL,
cv2.CHAIN_APPROX_NONE)
match_shapes('test.jpg', template_contours[0])
```
这段代码展示了如何加载测试图片以及模板图片,并利用Canny算子获取边缘再寻找轮廓最后调用`cv2.matchShapes()`完成匹配操作。
### 图像金字塔算法简介及其在Python中的实现
图像金字塔是一种多分辨率表示形式,在计算机视觉领域有着广泛的应用场景,如快速检测、特征提取等。它分为两种基本类型:高斯金字塔与拉普拉斯金字塔。
#### 构建高斯金字塔
构建高斯金字塔的过程涉及重复应用平滑滤波器(通常是高斯核),随后降低采样率形成下一层级。此过程可通过`cv2.pyrDown()`函数轻松实现。
```python
gaussian_pyramid = [img.copy()]
for i in range(6):
next_level = cv2.pyrDown(gaussian_pyramid[i])
gaussian_pyramid.append(next_level)
```
上述代码片段创建了一个包含七层的高斯金字塔结构,每执行一次循环都会使当前层缩小一半尺寸[^4]。
#### 创建拉普拉斯金字塔
拉普拉斯金字塔由相邻两层高斯金字塔相减而得,能够捕捉到细节信息的变化情况。具体来说就是先对低分辨率版本做放大处理后再作差运算:
```python
laplacian_top = gaussian_pyramid[-1]
lp = []
for i in range(len(gaussian_pyramid)-1, 0, -1):
size=(gaussian_pyramid[i-1].shape[1], gaussian_pyramid[i-1].shape[0])
expanded = cv2.pyrUp(gaussian_pyramid[i], dstsize=size)
laplacian = cv2.subtract(gaussian_pyramid[i-1],expanded )
lp.append(laplacian)
lp.append(laplacian_top)
```
这里实现了完整的拉普拉斯金字塔构造逻辑,从最高层次开始逐层向下直到原始大小为止。
计算原始图像的高斯金字塔Python代码
计算原始图像的高斯金字塔是一种常用的图像处理方法,它可以将原始图像分解成多个不同尺度的图像,以便于后续的处理。下面是一个简单的Python代码实现:
```python
import cv2
import numpy as np
# 读取原始图像
img = cv2.imread('image.jpg')
# 定义高斯金字塔的层数
level = 3
# 定义高斯核的大小
ksize = 3
# 初始化高斯金字塔
gaussian_pyramid = [img]
# 生成高斯金字塔
for i in range(level):
# 计算高斯模糊
gaussian = cv2.GaussianBlur(gaussian_pyramid[i], (ksize, ksize), 0)
# 降采样
downsample = cv2.pyrDown(gaussian)
# 添加到高斯金字塔中
gaussian_pyramid.append(downsample)
# 显示高斯金字塔
for i, layer in enumerate(gaussian_pyramid):
cv2.imshow('Gaussian Pyramid Layer {}'.format(i), layer)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
上述代码使用了OpenCV库中的`cv2.GaussianBlur()`函数来进行高斯模糊操作,使用了`cv2.pyrDown()`函数来进行降采样操作。其中`gaussian_pyramid`为高斯金字塔列表,`level`为高斯金字塔的层数,`ksize`为高斯核的大小。代码执行完成后,将会显示生成的高斯金字塔图像。
阅读全文
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231044930.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![-](https://img-home.csdnimg.cn/images/20241226111658.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)