【Opencv入门到项目实战】(六):图像金字塔

1.图像金字塔

图像金字塔是一种多尺度表示的方法,用于在不同分辨率下对图像进行分析和处理。如下图所示:

图像金字塔可以将原始图像分解为一系列层级的图像,每个层级都代表了不同尺度的细节信息。比如说我们要做一些图像特征提取,在进行特征提取的时候,我们不仅仅对一张原始输入进行特征提取,而是在图像金字塔每一层当中都进行特征提取,而每一层特征提取出来的结果是不一样的,我们再把特征提取出来的结果融合在一起。

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

1.1 高斯金字塔

1.1.1 向下采样法(缩小)

向下采样法是越采样越小,不断降低图像的分辨率,使得图片越变越小,因此它的方向是朝着金字塔顶端。

构建过程如下:

  • 首先,将原始图像作为第一层(底层)的图像。
  • 然后,通过应用高斯滤波器对当前层级的图像进行平滑处理。
  • 接着,将平滑后的图像进行下采样,将图像的尺寸缩小一半。
  • 重复上述步骤直到达到金字塔的顶层(分辨率最低的层级)。

1.1.2​ 向上采样法(放大)

向下采样法是越采样越大,不断增加图像的分辨率,使得图片越变越大,因此它的方向是朝着金字塔底端。具体做法如下:

  • 使图像在每个方向扩大为原来的两倍,新增的行和列以0填充
  • 使用高斯核与放大后的图形进行卷积操作,得到近似值

在OpenCV中,我们分别调用cv2.pyrUP()cv2.pyrDown()来实现上采样和下采样,下面我们来看具体代码

scss 复制代码
import cv2
​
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()
# 查看原始图片
img=cv2.imread("yangqi.jpg")
cv_show(img,'img')
print (img.shape)
scss 复制代码
(238, 218, 3)

下面我们来分别看下采样和上采样后的结果

上采样

bash 复制代码
# 上采样
up=cv2.pyrUp(img)
cv_show(up,'up')
print (up.shape) #查看上采样后的结果维度
scss 复制代码
(476, 436, 3)

可以看到,图片变得更大了,并且图像的行和宽都是原来的两倍

下采样

bash 复制代码
# 下采样
down=cv2.pyrDown(img)
cv_show(down,'down')
print (down.shape) #查看下采样后的结果维度
scss 复制代码
(119, 109, 3)

可以看到,图片变得更小了,并且图像的行和宽都是原来的一半。

小结

高斯金字塔的每一层级都包含了原始图像的低频信息,并且每个层级的分辨率比前一层级低。高斯金字塔可用于图像的缩放、降噪以及图像融合等应用。

1.2拉普拉斯金字塔

拉普拉斯金字塔是通过高斯金字塔构建的,可以用于重建原始图像,也可以用于实现图像的增强和压缩等操作。构建过程如下:

对图像项进行下采样,得到G1,然后经过上采样得到E1,然后用原始图像减去E1即可,我们可以进行多次重复操作得到不同层的结果,下面以生成L1为例,使用opencv代码如下:

ini 复制代码
down=cv2.pyrDown(img)
down_up=cv2.pyrUp(down)
l_1=img-down_up
cv_show(l_1,'l_1')

2.模板匹配

模板匹配是指在图像中寻找与给定模板最相似的部分,它的基本思想和卷积原理很像,模板在原图像上从原点开始滑动,计算模板与(图像被模板覆盖的地方)的差别程度,以此来找到最佳匹配位置。这个差别程度的计算方法在opencv里有6种,然后将每次计算的结果放入一个矩阵里,作为结果输出。假如原图形是AxB大小,而模板是axb大小,则输出结果的矩阵是(A-a+1)x(B-b+1)

  • TM_SQDIFF:计算平方不同,计算出来的值越小,越相关
  • TM_CCORR:计算相关性,计算出来的值越大,越相关
  • TM_CCOEFF:计算相关系数,计算出来的值越大,越相关
  • TM_SQDIFF_NORMED:计算归一化平方不同,计算出来的值越接近0,越相关
  • TM_CCORR_NORMED:计算归一化相关性,计算出来的值越接近1,越相关
  • TM_CCOEFF_NORMED:计算归一化相关系数,计算出来的值越接近1,越相关

我们先来看两张图

ini 复制代码
# 模板匹配
import cv2
img = cv2.imread('lena.jpg', 0) #目标图片
template = cv2.imread('face.jpg', 0) #要匹配的模板
h, w = template.shape[:2] #模板的大小
img.shape,template.shape
​
​
scss 复制代码
((263, 263), (110, 85))
scss 复制代码
def cv_show(img,name):
    cv2.imshow(name,img)
    cv2.waitKey()
    cv2.destroyAllWindows()

# 显示原始图片
cv_show(img,'img')
arduino 复制代码
cv_show(template,'template')

我们想要做的就是将模板匹配到目标图形的位置

2.1 获取匹配结果

Opencv中,我们调用cv2.matchTemplate()函数来进行模板匹配,具体语法如下

arduino 复制代码
 cv2.matchTemplate(img, template, method)

其中img是传入的图片,template是要匹配的模板,method就是我们刚刚介绍到的几种方法,下面来看具体例子

ini 复制代码
res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)
res.shape
scss 复制代码
(154, 179)

可以看到这里的维度是(154,179),验证了我们之前所介绍的内容,等于(263-110+1,263-85+1)。

2.2 获取匹配位置信息

匹配后,我们可以通过 cv2.minMaxLoc() 函数获取匹配结果的最大值和最小值,以及对应的位置信息。

ini 复制代码
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
min_val,max_val,min_loc,max_loc
scss 复制代码
(39168.0, 74403584.0, (107, 89), (159, 62))

这里给出了最大最小值和对应的坐标,我们就能根据这些信息绘制出模板匹配的位置。

2.3 绘制匹配边框

根据最佳匹配位置,可以在原始图像上绘制一个矩形框来标记匹配位置。使用 cv2.rectangle() 函数可以实现这一步骤。我们接下来分别看使用六种不同方法得到的结果

ini 复制代码
import matplotlib.pyplot as plt

methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
           'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', 'cv2.TM_SQDIFF_NORMED']
for i in methods:
    img2 = img.copy()

    # 匹配方法的真值
    method = eval(i)
    print (method)
    res = cv2.matchTemplate(img, template, method)
    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

    # 如果是平方差匹配TM_SQDIFF或归一化平方差匹配TM_SQDIFF_NORMED,取最小值
    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:
        top_left = min_loc
    else:
        top_left = max_loc
    bottom_right = (top_left[0] + w, top_left[1] + h)

    # 绘制匹配边框
   
    cv2.rectangle(img2, top_left, bottom_right, 255, 2)

    plt.subplot(121), plt.imshow(res, cmap='gray')
    plt.xticks([]), plt.yticks([])  #
    plt.subplot(122), plt.imshow(img2, cmap='gray')
    plt.xticks([]), plt.yticks([])
    plt.suptitle(i)
    plt.show()

从结果上来看,使用了归一化的几种方法效果都不错。

需要注意的是,另外,模板匹配是一种局部匹配方法,对光照变化、旋转变换等情况比较敏感。在某些情况下,可能需要结合其他技术,如特征提取和机器学习等方法,来提高匹配的准确性和鲁棒性。

相关推荐
程序小旭1 小时前
机器视觉基础—双目相机
计算机视觉·双目相机
qzhqbb1 小时前
基于统计方法的语言模型
人工智能·语言模型·easyui
冷眼看人间恩怨2 小时前
【话题讨论】AI大模型重塑软件开发:定义、应用、优势与挑战
人工智能·ai编程·软件开发
2401_883041082 小时前
新锐品牌电商代运营公司都有哪些?
大数据·人工智能
AI极客菌3 小时前
Controlnet作者新作IC-light V2:基于FLUX训练,支持处理风格化图像,细节远高于SD1.5。
人工智能·计算机视觉·ai作画·stable diffusion·aigc·flux·人工智能作画
阿_旭3 小时前
一文读懂| 自注意力与交叉注意力机制在计算机视觉中作用与基本原理
人工智能·深度学习·计算机视觉·cross-attention·self-attention
王哈哈^_^3 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
Power20246664 小时前
NLP论文速读|LongReward:基于AI反馈来提升长上下文大语言模型
人工智能·深度学习·机器学习·自然语言处理·nlp
数据猎手小k4 小时前
AIDOVECL数据集:包含超过15000张AI生成的车辆图像数据集,目的解决旨在解决眼水平分类和定位问题。
人工智能·分类·数据挖掘
好奇龙猫4 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法