图像金字塔(Python实现)

article/2025/10/23 1:57:45

图像金字塔(Python实现)
1 简介
在图像处理中常常会调整图像大小,最长的就是放大(zoom in)和缩小(zoom out),尽管集合变换也可以实现图像放大或者缩小
一个图像金字塔式一系列的图像组成,最底下一张式图像尺寸最大,最上方的图像尺寸最小,从空间上从上向下看,就可以看成埃及金字塔.
高斯金字塔–用来对 图像进行降采样
拉普拉斯金字塔–用来重建一张图片根据他的上层降采样图片
2 高斯金字塔
高斯金字塔式从底向上,逐层降采样得到.

降采样之后图像大小式原来 图像的M*N的M/2*N/2,就是对原图像删除偶数行与列,即得到降采样之后上一层的图片

步骤:

对当前层进行高斯模糊
删除当前层的偶数行与列
即可得到上一层的图像,这样上一层跟下一层对比,都只有 他的1/4大小
在这个过程中是一层一层的实现的,不能凭空跳跃多层.

3 高斯不同(Difference of Gaussian -DOG)
Difference of Gaussian(DOG)是高斯函数的差分。可以通过图像与高斯函数进行卷积得到一副图像的低通滤波结果,即去噪过程,这里的高斯和低通高斯式一样的,是一个函数,即为正态分布函数.高斯函数为: 
G(x)=12πσ2−−−−√e−x22σ2
G(x)=12πσ2e−x22σ2

那么Difference of Gaussian即高斯函数查分是两附图高斯图像的差.即: 
f(x;μ,σ1,σ2)=1σ12π−−√e−(x−μ)22μ2−1σ22π−−√e−(x−μ)22σ22
f(x;μ,σ1,σ2)=1σ12πe−(x−μ)22μ2−1σ22πe−(x−μ)22σ22
定义:就是把同一张图像在不同的参数下做高斯模糊之后的结果相减,得到的输出图像.称为高斯不同(DOG).
高斯不同式图像的内在特征,在灰度图像增强\角点检测中经常用到.
对于采用的每一层我们都可以做DOG,然后再做下一步的采样
通过高斯不同可以获得图像的轮廓,或者角点.
4 Opencv采样API
详见代码部分.

参考文献
DOG角点检测——opencv实现
DoG (Difference of Gaussian)角点检测
--------------------- 
作者:DataH 
来源:CSDN 
原文:https://blog.csdn.net/weixin_41863685/article/details/81916605 
版权声明:本文为博主原创文章,转载请附上博文链接!

pytorch实现卷积:


class GaussianBlur(nn.Module):
    def __init__(self):
        super(GaussianBlur, self).__init__()
        kernel = [[0.03797616, 0.044863533, 0.03797616],
                  [0.044863533, 0.053, 0.044863533],
                  [0.03797616, 0.044863533, 0.03797616]]
        kernel = torch.FloatTensor(kernel).unsqueeze(0).unsqueeze(0)
        self.weight = nn.Parameter(data=kernel, requires_grad=False)
 
    def forward(self, x):
        x1 = x[:, 0]
        x2 = x[:, 1]
        x3 = x[:, 2]
        x1 = F.conv2d(x1.unsqueeze(1), self.weight, padding=2)
        x2 = F.conv2d(x2.unsqueeze(1), self.weight, padding=2)
        x3 = F.conv2d(x3.unsqueeze(1), self.weight, padding=2)
        x = torch.cat([x1, x2, x3], dim=1)
        return x
 这里为了网络模型需要写成了一个类,这里假设输入的x也就是经过网络提取后的三通道特征图(当然不一定是三通道可以是任意通道)

如果是任意通道的话,使用torch.expand()向输入的维度前面进行扩充。如下:

    def blur(self, tensor_image):
        kernel = [[0.03797616, 0.044863533, 0.03797616],
               [0.044863533, 0.053, 0.044863533],
               [0.03797616, 0.044863533, 0.03797616]]
       
        min_batch=tensor_image.size()[0]
        channels=tensor_image.size()[1]
        out_channel=channels
        kernel = torch.FloatTensor(kernel).expand(out_channel,channels,3,3)
        self.weight = nn.Parameter(data=kernel, requires_grad=False)
 
        return F.conv2d(tensor_image,self.weight,1,1)
--------------------- 
作者:亮亮兰 
来源:CSDN 
原文:https://blog.csdn.net/lyl771857509/article/details/84113177 
版权声明:本文为博主原创文章,转载请附上博文链接!

 

在这里我将以Python3.6.1,Opencv 3.2版本进行代码展示和讲解。

图像金字塔主要涉及两个函数:cv2.pyrUp()(图像尺寸变小),cv2.pyrDown()(图像尺寸变大,但会模糊)

图像金字塔有两类类型:高斯金字塔和拉普拉斯金字塔。

高斯金字塔cv2.pyrUp() 的效果

高斯金字塔将小图变大图用,cv2.pyrDown(),但是图像会模糊

对于拉普拉斯金字塔,其计算公式与高斯金字塔相关,具体为

Li=Gi-pyrUp(Gi+1), 其中i和i+1为下角标

import cv2
import numpy as np
A = cv2.imread('apple.jpg')
B = cv2.imread('orange.jpg')
# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in np.arange(6):     #将苹果进行高斯金字塔处理,总共六级处理
    G = cv2.pyrDown(G)
    gpA.append(G)
# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in np.arange(6):  # #将橘子进行高斯金字塔处理,总共六级处理
    G = cv2.pyrDown(G)
    gpB.append(G)
# generate Laplacian Pyramid for A
lpA = [gpA[5]]               
for i in np.arange(5,0,-1):    #将苹果进行拉普拉斯金字塔处理,总共5级处理
    GE = cv2.pyrUp(gpA[i])
    L = cv2.subtract(gpA[i-1],GE)
    lpA.append(L)
# generate Laplacian Pyramid for B
lpB = [gpB[5]]
for i in np.arange(5,0,-1):    #将橘子进行拉普拉斯金字塔处理,总共5级处理
    GE = cv2.pyrUp(gpB[i])
    L = cv2.subtract(gpB[i-1],GE)
    lpB.append(L)
# Now add left and right halves of images in each level
#numpy.hstack(tup)
#Take a sequence of arrays and stack them horizontally
#to make a single array.
LS = []
for la,lb in zip(lpA,lpB):
    rows,cols,dpt = la.shape
    ls = np.hstack((la[:,0:cols//2], lb[:,cols//2:]))    #将两个图像的矩阵的左半部分和右半部分拼接到一起
    LS.append(ls)
# now reconstruct
ls_ = LS[0]   #这里LS[0]为高斯金字塔的最小图片
for i in xrange(1,6):                        #第一次循环的图像为高斯金字塔的最小图片,依次通过拉普拉斯金字塔恢复到大图像
    ls_ = cv2.pyrUp(ls_)
    ls_ = cv2.add(ls_, LS[i])                #采用金字塔拼接方法的图像
# image with direct connecting each half
real = np.hstack((A[:,:cols/2],B[:,cols/2:]))   #直接的拼接
cv2.imwrite('Pyramid_blending2.jpg',ls_)
cv2.imwrite('Direct_blending.jpg',real)
--------------------- 
作者:Lecol_leng 
来源:CSDN 
原文:https://blog.csdn.net/jjddss/article/details/73469348 
版权声明:本文为博主原创文章,转载请附上博文链接!

pytorch实现LP 金子塔:https://github.com/mtyka/laploss/blob/master/laploss.py

https://ptorch.com/news/115.html

 


http://chatgpt.dhexx.cn/article/9dU3brBR.shtml

相关文章

图像金字塔分层算法

一. 图像金字塔概述 欢迎关注微信公众号“智能算法”! 1. 图像金字塔是图像中多尺度表达的一种,最主要用于图像的分割,是一种以多分辨率来解释图像的有效但概念简单的结构。 2. 图像金字塔最初用于机器视觉和图像压缩,一幅图像的金…

图像金字塔是什么?

一般情况下,我们要处理是一副具有固定分辨率的图像。但是有些情况下,我们需要对同一图像的不同分辨率的子图像进行处理。比如,我们要在一幅图像中查找某个目标,比如脸,我们不知道目标在图像中的尺寸大小。这种情况下&a…

图像处理之高斯金字塔

一:图像金字塔基本操作 对一张图像不断的模糊之后向下采样,得到不同分辨率的图像,同时每次得到的 新的图像宽与高是原来图像的1/2, 最常见就是基于高斯的模糊之后采样,得到的 一系列图像称为高斯金字塔。 高斯金字塔不同(DoG)又…

【OpenCV学习笔记】之图像金字塔(Image Pyramid)

一、尺度调整 顾名思义,即对源图像的尺寸进行放大或者缩小变换。在opencv里面可以用resize函数,将源图像精准地转化为指定尺寸的目标图像。要缩小图像,一般推荐使用CV_INETR_AREA(区域插值)来插值;若要放大图像,推荐使…

图像金字塔总结

本文转载自: http://blog.csdn.net/dcrmg/article/details/52561656 一、 图像金字塔 图像金字塔是一种以多分辨率来解释图像的结构,通过对原始图像进行多尺度像素采样的方式,生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底…

数字图像处理(21): 图像金字塔(高斯金字塔 与 拉普拉斯金字塔)

目录 1 图像金字塔简介 2 向下取样——pyrDown() 2.1 基础理论 2.2 代码示例 3 向上取样——pyrUp() 3.1 基础理论 3.2 代码示例 4 Laplacian 金字塔 4.1 基础理论 4.2 代码示例 参考资料 1 图像金字塔简介 以多个分辨率来表示图像的一种有效且概念简单的结构是图像…

图像处理(二):图像金字塔

图像金字塔是图像多尺度表达的一种,是一种以多分辨率来解释图像的有效且概念简单的结构。一幅图像的金字塔是一系列以金字塔形状排列的分辨率逐步降低,且来源于同一张原始图的图像集合。 高斯金字塔是常见的图像金字塔,如下所示:…

什么是图像金字塔

有些情况下,我们需要处理源自同一张图像的不同分辨率的图像集合。这些不同分辨率的图像组成的集合称为图像金字塔。 图像金字塔的主要类型可分为低通和带通 有两种常用图像金字塔: Gaussian Pyramid (低通)Laplacian Pyramids &…

OpenCV图像处理学习十三,图像金字塔——高斯金字塔和拉普拉斯金字塔

一.图像金字塔概念 我们在图像处理中常常会调整图像大小,最常见的就是放大(zoom in)和缩小(zoom out),尽管几何变换也可以实现图像放大和缩小,但是这里我们介绍图像金字塔 。 一个图像金字塔是由一系列的图像组成&…

图像金字塔

图像金字塔是图像处理和计算机视觉中的概念,常常用于多尺度处理领域(multiscale processing),尤其早年的图像匹配、识别等算法中都用到了图像金字塔 高斯金字塔(Gaussian pyramid) 金字塔的底层为原始图像&#xff0…

【OpenCV 学习笔记】第十一章: 图像金字塔

第十一章: 图像金字塔 一、什么是图像金字塔 同一张图片不同分辨率的子图的集合。 图像金字塔底部是待处理的高分辨率图像,也就是原始图像,顶部是低分辨率的近似图像。一般情况下,都是每向上移动一级,图像的宽和高都降低为原来的…

openCV——图像金字塔

图像金字塔 理论基础 通常情况下,图像金字塔的底部是待处理的高分辨率图像(原始图像),而顶部则为其低 分辨率的近似图像。向金字塔的顶部移动时,图像的尺寸和分辨率都不断地降低。通常情况下, 每向上移动一…

第11章:图像金字塔

第11章:图像金字塔 一、理论基础:1. 向下采样:2. 向上采样: 二、pyrDown函数使用:三、pyrUp函数及使用:四、采样可逆性研究五、拉普拉斯金字塔1. 定义:2. 应用: 什么是图像金子塔&am…

C语言for语句简单打印心形。

C语言简单for语句打印心形 #include<stdio.h> int main() {int i;int j;int k;int n;int m;printf("\n\n\n\n\n\n\n\n表白朋友圈:\n\n\n\n");for (i 1; i < 3; i){if (i 1){printf(" ");printf(&quo…

C语言暴力解法:围圈报数(解析与思考)

围圈报数 题目 解题步骤 一.整体逻辑 1.从第&#xff11;个人开始报数&#xff0c; 2.数到第&#xff4d;个人出列&#xff0c; 3.然后从出列的下一个人开始报数&#xff0c; 4.数到第&#xff4d;个人又出列&#xff0c;…&#xff0c;如此反复到所有的人全部出列为止。 二…

html 一个圆圈一个c,如何用c语言程序画一个圆?

以一个空心圆来举例。 /* 判断是是否在圆上 */ int isAtCircle(int x, int y, int r) { /* 将(x, y)转换为相当圆心(r, r)的坐标 */ int rx x - r; int ry y - r; double d sqrt(rx*rx ry*ry) - r; /*计算到圆心的距离*/ if(fabs(d) < 0.5)""> return 1; e…

在HTML 页面中如何显示带圈圈的数字

数字外面有个圈圈&#xff0c; 或者圈圈里有反底色显示&#xff0c;效果类似&#xff1a; 带圈圈的数字示例&#xff1a; ① 反色圈圈数字示例&#xff1a; ❶ 要实现上面的效果&#xff0c;使用以下技术都可以达成&#xff1a; 方式1&#xff0c;. 使用图片 <image&…

C语言打印出心形表白,初学C语言也能看懂~(3)

例2&#xff1a;C语言实现打印出心形&#xff0c;初学者的表白神器。 解题思路&#xff1a;这道例题可以分成4部分&#xff0c;前3行一部分&#xff0c;4-6行一部分&#xff0c;7-13行一部分&#xff0c;最后一行一部分&#xff0c;读者请仔细阅读注释&#xff0c;小林写的很详…

C语言-报数出圈问题(链表实现)

问题描述&#xff1a;n个人围成一圈&#xff0c;顺序编号。从第一个人开始从1到m报数&#xff0c;凡报到m的人退出圈子&#xff0c;编程求解最后留下的人的初始编号。 程序运行示例&#xff1a; 6 3&#xff08;两个输入数据之间有空格&#xff09; 1输入格式&#xff1a;scanf…

蓝桥杯 小朋友崇拜圈 C语言

标题&#xff1a;小朋友崇拜圈 班里N个小朋友&#xff0c;每个人都有自己最崇拜的一个小朋友&#xff08;也可以是自己&#xff09;。 在一个游戏中&#xff0c;需要小朋友坐一个圈&#xff0c; 每个小朋友都有自己最崇拜的小朋友在他的右手边。 求满足条件的圈最大多少人&…