OpenCV官方教程中文版 —— 图像金字塔

这篇具有很好参考价值的文章主要介绍了OpenCV官方教程中文版 —— 图像金字塔。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

学习图像金字塔

使用图像创建一个新水果:“橘子苹果”

将要学习的函数有:cv2.pyrUp(),cv2.pyrDown()。

一、原理

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

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

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

函数 cv2.pyrDown() 从一个高分辨率大尺寸的图像向上构建一个金子塔(尺寸变小,分辨率降低)。

# -*- coding:utf-8 -*-
import cv2 as cv

# 高斯金字塔
def pyramid_demo(image):
    level = 4  # 金字塔的层数
    temp = image.copy()  # 拷贝图像
    pyramid_images = []
    for i in range(level):
        dst = cv.pyrDown(temp)  # down是降采样-尺寸变小,分辨率降低(缩小)
        pyramid_images.append(dst)
        cv.imshow("pyramid" + str(i), dst)
        temp = dst.copy()
    return pyramid_images

src = cv.imread("ball.png")
cv.namedWindow('input image', cv.WINDOW_NORMAL)
cv.imshow("input image", src)
pyramid_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

下图是一个四层的图像金字塔。

OpenCV官方教程中文版 —— 图像金字塔,opencv,计算机视觉,人工智能
函数 cv2.pyrUp() 从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会增加)。

higher_reso2 = cv2.pyrUp(lower_reso)

你要记住的是是 higher_reso2 和 higher_reso 是不同的。因为一旦使用 cv2.pyrDown(),图像的分辨率就会降低,信息就会被丢失。下图就是从 cv2.pyrDown() 产生的图像金字塔的(由下到上)第三层图像使用函数cv2.pyrUp() 得到的图像,与原图像相比分辨率差了很多。

OpenCV官方教程中文版 —— 图像金字塔,opencv,计算机视觉,人工智能

拉普拉斯金字塔可以有高斯金字塔计算得来,公式如下:

OpenCV官方教程中文版 —— 图像金字塔,opencv,计算机视觉,人工智能
拉普拉金字塔的图像看起来就像边界图,其中很多像素都是 0。他们经常被用在图像压缩中。下图就是一个三层的拉普拉斯金字塔:

# -*- coding:utf-8 -*-
import cv2 as cv
# 高斯金字塔
def pyramid_demo(image):
    level = 4  # 金字塔的层数
    temp = image.copy()  # 拷贝图像
    pyramid_images = []
    for i in range(level):
        dst = cv.pyrDown(temp)  # down是降采样-尺寸变小,分辨率降低(缩小)
        pyramid_images.append(dst)
        cv.imshow("pyramid" + str(i), dst)
        temp = dst.copy()
    return pyramid_images


# 拉普拉斯金字塔,拉普拉斯金字塔时,图像大小必须是2的n次方*2的n次方,不然会报错
def laplian_demo(image):
    pyramid_images = cv.resize(image, (512, 512), interpolation=cv.INTER_CUBIC)  # 可以替换成INTER_LINEAR
    pyramid_images = pyramid_demo(pyramid_images)
    level = len(pyramid_images)  # 4 层
    for i in range(level-1, 0, -1):  # 每次递减
        expand = cv.pyrUp(pyramid_images[i], dstsize=pyramid_images[i - 1].shape[:2])
        lpls = cv.subtract(pyramid_images[i - 1], expand)
        cv.imshow("lpls_down" + str(i), lpls)

def pyramid_demo_2(image):
    higher_reso2 = cv.pyrUp(image)
    cv.imshow("pyramid", higher_reso2)
    return higher_reso2

src = cv.imread("ball.png")
src2 = cv.imread("lower_reso.png")
cv.namedWindow('input image', cv.WINDOW_NORMAL)
cv.imshow("input image", src)
#pyramid_demo(src)
#pyramid_demo_2(src2)
laplian_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

OpenCV官方教程中文版 —— 图像金字塔,opencv,计算机视觉,人工智能

二、使用金字塔进行图像融合

图像金字塔的一个应用是图像融合。例如,在图像缝合中,你需要将两幅图叠在一起,但是由于连接区域图像像素的不连续性,整幅图的效果看起来会很差。这时图像金字塔就可以排上用场了,他可以帮你实现无缝连接。这里的一个经典案例就是将两个水果融合成一个,看看下图也许你就明白我在讲什么了。

你可以通过阅读后边的更多资源来了解更多关于图像融合,拉普拉斯金字塔的细节。实现上述效果的步骤如下:

  1. 读入两幅图像,苹果和橘子
  2. 构建苹果和橘子的高斯金字塔(6 层)
  3. 根据高斯金字塔计算拉普拉斯金字塔
  4. 在拉普拉斯的每一层进行图像融合(苹果的左边与橘子的右边融合)
  5. 根据融合后的图像金字塔重建原始图像。

OpenCV官方教程中文版 —— 图像金字塔,opencv,计算机视觉,人工智能
整个过程的代码如下。(为了简单,每一步都是独立完成的,这回消耗更多的内存,如果你愿意的话可以对他进行优化)

OpenCV官方教程中文版 —— 图像金字塔,opencv,计算机视觉,人工智能文章来源地址https://www.toymoban.com/news/detail-733745.html

# -*- coding: utf-8 -*-
import cv2
from matplotlib import pyplot as plt
import numpy as np

A = cv2.imread('apple.png')
A = cv2.resize(A, (256, 256), interpolation=cv2.INTER_CUBIC)  # 可以替换成INTER_LINEAR
B = cv2.imread('orange.png')
B = cv2.resize(B, (256, 256), interpolation=cv2.INTER_CUBIC)  # 可以替换成INTER_LINEAR
b, g, r = cv2.split(A)
A = cv2.merge([r, g, b])
b, g, r = cv2.split(B)
B = cv2.merge([r, g, b])

# generate Gaussian pyramid for A
G = A.copy()
gpA = [G]
for i in range(6):
    G = cv2.pyrDown(G)
    gpA.append(G)

# generate Gaussian pyramid for B
G = B.copy()
gpB = [G]
for i in range(6):
    G = cv2.pyrDown(G)
    gpB.append(G)

# generate Laplacian Pyramid for A
lpA = [gpA[5]]
for i in range(5, 0, -1):
    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 range(5, 0, -1):
    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:int(cols / 2)], lb[:, int(cols / 2):]))
    LS.append(ls)

# now reconstruct
ls_ = LS[0]
for i in range(1, 6):
    ls_ = cv2.pyrUp(ls_)
    ls_ = cv2.add(ls_, LS[i])

# image with direct connecting each half
real = np.hstack((A[:, :int(cols / 2)], B[:, int(cols / 2):]))

plt.figure()
plt.subplot(221)
plt.imshow(A)  # expects distorted color
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.title("apple")
plt.subplot(222)
plt.imshow(B)  # expect true color
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.title("orange")
plt.subplot(223)
plt.imshow(real)  # expect true color
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.title("Direct_connection")
plt.subplot(224)
plt.imshow(ls_)  # expect true color
plt.xticks([]), plt.yticks([])  # to hide tick values on X and Y axis
plt.title("Pyramid_blending")
plt.show()

到了这里,关于OpenCV官方教程中文版 —— 图像金字塔的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • OpenCV官方教程中文版 —— 直方图均衡化

    本小节我们要学习直方图均衡化的概念,以及如何使用它来改善图片的对比。 想象一下如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高。但是一副高质量的图像的像素值分布应该很

    2024年02月06日
    浏览(16)
  • OpenCV官方教程中文版 —— 直方图的计算,绘制与分析

    • 使用 OpenCV 或 Numpy 函数计算直方图 • 使用 Opencv 或者 Matplotlib 函数绘制直方图 • 将要学习的函数有:cv2.calcHist(),np.histogram() 什么是直方图呢?通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值(0 到 255),y 轴是图片中具有同一个灰度

    2024年02月06日
    浏览(15)
  • BeeWare官方教程中文版

    BeeWare官方教程 中文文档下载地址 以下内容为按照教程在windows平台测试。 如果你使用Windows系统,可以从python官网获取官方安装包。可以使用3.7之后的任何稳定版本的Python。建议避免使用阿尔法,贝塔和其他已经发布的候选版本。 在Windows系统上构建BeeWare 需要: Git,一种分

    2024年02月05日
    浏览(21)
  • Midjourney中文版到底是官方还是李鬼?

    AI绘画大神Midjourney为何选择QQ频道进军中国市场? Midjourney中文版到底是官方还是李鬼?看这篇文章就知道了! 今天我想和大家聊聊一个最近很火的话题,那就是AI绘画神器Midjourney(简称MJ)来中国了,QQ频道内测火爆开启。这对于喜欢AI绘画的创作者来说,无疑是一个福音,

    2024年02月12日
    浏览(18)
  • 《巧克甜恋》官方中文版全解锁存档分享

    因为之前修复更新英文版后补丁失效的问题一不小心把存档删了,遂意识到了存档的重要性,也特此分享给需要的朋友。 全解锁存档下载

    2024年02月12日
    浏览(11)
  • 爆肝一周,我开源了ChatGPT 中文版接口,官方1:1镜像支持全部 官方接口

    这里实现我之前文章承诺承接上文 人人实现ChatGPT自由,手把手教你零撸部署自己聊天私服 现在 ChatGPT 提供了 api 接口 可以让我自己对接去实现我们自己想要gpt应用,但是由于一些原因,国内也不开放接口,所以我就1:1 自己对接了官方所有接口。 大家可以通过我的接口轻松

    2024年02月04日
    浏览(20)
  • FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows/mac官方中文版

    FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows FL Studio Producer Edition 21 v21.0.3 Build 3517 Windows/mac官方中文版是一个完整的软件音乐制作环境或数字音频工作站(DAW)。它代表了 25 多年的创新发展,将您创作、编曲、录制、编辑、混音和掌握专业品质音乐所需的一切集于一身。 FL S

    2024年02月14日
    浏览(14)
  • Postman -中文版-安装教程

    一.下载、安装  Postman 下面是历史版本的下载链接地址    请把链接中的\\\"版本号\\\"替换为指定的版本号(根据自己的需求变更) Windows64位 : https://dl.pstmn.io/download/version/版本号/win64 Windows32位: https://dl.pstmn.io/download/version/版本号/win32 Mac : https://dl.pstmn.io/download/version/版本号

    2024年02月03日
    浏览(20)
  • Midjourney AI 官方中文版已开启内测申请;OpenAI 正准备向公众发布一款新的开源语言模型。

    🚀 Midjourney AI 官方中文版已开启内测申请,搭载在 QQ 频道上,召唤机器人进行作画。 Midjourney AI 官方中文版已开启内测申请,搭载在 QQ 频道上,召唤机器人进行作画。 可调用 MJ 和 Niji 的最新模型和所有参数,还上线了放大、变化、指定修改、垫图、私聊、个人画廊等功能

    2024年02月15日
    浏览(13)
  • STM32CubeIDE中文版教程

    STM32CubeIDE中文版教程 首先 https://mirrors.ustc.edu.cn/eclipse/technology/babel/update-site/ 点击此网址进入 如图,选择日期最新的,点进去 再次选择最新的日期 进入到此界面,复制此时的网址  https://mirrors.ustc.edu.cn/eclipse/technology/babel/update-site/R0.20.0/2022-12/ 打开STM32CubeIDE help-Install New Sof

    2024年02月07日
    浏览(16)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包