本节内容要用到opencv-python模块,请先行安装。本例程中使用到的图片保存在pictures子目录下。本例的任务是要将9张JPG格式图片按三行三列拼接成下述九宫格。

微实践:九宫格图像拼接

本节内容要用到opencv-python模块,请先行安装。本例程中使用到的图片保存在pictures子目录下。本例的任务是要将9张JPG格式图片按三行三列拼接成下述九宫格。

#pictures9.py

import glob

import numpy as np

from cv2 import imread,imwrite #cv2来自OpenCV-Python扩展库

imgs,heights,widths = [],[],[]

for f in glob.glob("pictures/*.jpg"):

img = imread(f,-1)

print("original:",img.shape)

h,w = img.shape[:2]

heights.append(h)

widths.append(w)

imgs.append(img)控制台输出:

original: (960, 1280, 3)

...

original: (793, 1280, 3)

...

original: (960, 1280, 3)

glob.glob("pictures/*.jpg")返回一个序列,该序列包括当前目录之pictures子目录下的所有扩展名为jpg的图片文件的文件名(含路径)。读者可以在上述循环中加上print(f)把这些文件名打出来看看。

本文节选自作者的《Python编程基础及应用》视频教程。Python编程基础及应用_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com

imread()函数来自opencv-python扩展库,它读取一个图片,并返回一个多维数组。我们打印了这些多维数组的形状,典型如(960,1280,3):它表示对应图片高960个像素,宽1280个像素,每个像素由3个值构成,分别表示该像素红、绿、蓝三个通道的颜色值。请读者注意,本例中的9张图片的高度值并不相等。

img.shape[:2]取出了图像/多维数组的高度和宽度,分别赋值给h和w。所有的图片高、宽均存入heights、widths列表备用。所有的图片/多维数组均存入imgs列表备用。

显然,(960,1280)的图片尺寸对于九宫格拼接而言太大了,需要分别提取缩略图。

#pictures9.py

#制作缩略图,纵横向每3个像素抽一个

minHeight = min(heights)

minWidth = min(widths)

for i,x in enumerate(imgs):

imgs[i] = x[:minHeight:3,:minWidth:3,:]

print("thumbnail:",imgs[i].shape)

#横向沿轴1拼接

img = np.concatenate(imgs,1)

print("concatenated by axis1:",img.shape)

imwrite("concatenated_1.jpg",img)

控制台输出:

thumbnail: (265, 427, 3)

...

thumbnail: (265, 427, 3)

concatenated by axis1: (265, 3843, 3)

我们首先获得了全部图像的最小高度 - min(heights)和最小宽度 - min(widths)。然后,遍历并逐一使用多维数组的切片下标语法提取缩略图:横纵向都从每3个像素中抽1个像素。根据打印出来的值,我们可以看到,所有的缩略图都是265 x 427个像素。

接下来,我们使用np.concatenate()函数将imgs列表中的9张图沿1轴拼接(横向拼接)至img。根据打印的结果,横向拼接后的图片尺寸为265 x 3843。imwrite()则将img存至文件"concatenated_1.jpg"。读者可以在项目目录中找到这个照片,如下:

下述代码及其执行结果可以帮助读者理解concatenate()函数的作用:可以看到,对于二维数组而言,沿0轴拼接相当于纵向延长数组,沿1轴拼接则相当于横向延长数组。

#con.py

import numpy as np

a = np.array([[1,2],[3,4]])

b = np.array([[11,22],[33,44]])

print("a=\n",a)

print("b=\n",b)

c = np.concatenate([a,b],0) #沿0轴拼接,纵向延长

print("np.concatenate([a,b],0)=\n",c)

c = np.concatenate([a,b],1) #沿1轴拼接,横向延长

print("np.concatenate([a,b],1)=\n",c)

执行结果:

a=

[[1 2]

[3 4]]

b=

[[11 22]

[33 44]]

np.concatenate([a,b],0)=

[[ 1 2]

[ 3 4]

[11 22]

[33 44]]

np.concatenate([a,b],1)=

[[ 1 2 11 22]

[ 3 4 33 44]]

借助于concatenate()函数,我们可以先将图片0-2横向拼接,再将图片3-5横向拼接,接着再将图片6-8横向拼接。最后再将拼接结果纵向拼接,即得3x3的九宫格:

#pictures9.py

#方法1

img0 = np.concatenate(imgs[:3],1) #沿1轴横向拼接

img1 = np.concatenate(imgs[3:6],1)

img2 = np.concatenate(imgs[6:],1)

img9 = np.concatenate([img0,img1,img2],0) #沿0轴纵向拼接

print("3x3_0, shape:",img9.shape)

imwrite("3x3_0.jpg",img9)

控制台输出:

3x3_0, shape: (795, 1281, 3)

上述3x3_0.jpg应该与本例开始处的图片相同,该文件也存入了当前项目目录,读者自行查证。除了上面这个方法外,下面这个方法也可以达到相同的效果,但真的很难理解。在下述代码中,img1.swapaxes(1,2)将img1的1轴与2轴进行了交换。

#方法2

img = np.concatenate(imgs,0) #将9图沿0轴纵向拼

img1 = img.reshape(3,3,265,427,3) #改变形状至5维数组

img9 = img1.swapaxes(1,2).reshape(795,1281,3) #1轴和2轴交换,再改变形状

print("3x3_1, shape:",img9.shape)

imwrite("3x3_1.jpg",img9)

控制台输出:

3x3_1, shape: (795, 1281, 3)

读者可以查证3x3_1.jpg的最终效果。

读者可以试着执行下述代码来观察轴交换的效果:

#swapaxes.py

import numpy as np

a = np.array([[1,2],[3,4]])

print("a=\n",a)

print("a.swapaxes(0,1):\n",a.swapaxes(0,1))

b = np.array([[1,2,3,4],[5,6,7,8]])

print("b=\n",b)

print("b.reshape(2,2,2)=\n",b.reshape(2,2,2))

print("b.reshape(2,2,2).swapaxes(1,2))=\n",b.reshape(2,2,2).swapaxes(1,2))

本文节选自作者的B站MOOC及同名教材:Python编程基础及应用 — 重庆大学 高等教育出版社,作者亲授_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com版权声明 本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。 本文不可以以纸质出版为目的进行改编、摘抄。

用python完成图形输出设备_使用numpy进行9宫格图像拼接 - Python相关推荐

  1. python降低图片分辨率_使用numpy快速降低图像分辨率的Python代码

    我首先要说的是,你的"只装箱"方式似乎很不寻常,我想这正是@ljetibo在评论中所指的.在"优化"讨论之后,我将回到这个话题.在 首先,您可以通过去掉对np. ...

  2. 使用numpy进行9宫格图像拼接

    本节内容要用到opencv-python模块,请先行安装.本例程中使用到的图片保存在pictures子目录下.本例的任务是要将9张JPG格式图片按三行三列拼接成下述九宫格. 版权声明 本文可以在互联网 ...

  3. python基本图形绘制_【Python】Python基本图形绘制-Go语言中文社区

    1.Python蟒蛇图形绘制: 代码: #PythonDraw.py import turtle turtle.setup(650, 350, 200, 200) turtle.penup() tur ...

  4. python简单图形输出_基于 Python Matplotlib 模块的高质量图形输出

    Matplotlib 是一个由 John Hunter 等开发的,用以绘制二维图形的 Python 模块.它利用了 Python 下的数值计算模块 Numeric 及 Numarray,克隆了许多 M ...

  5. python怎么取共轭_自用numpy语法的共轭转置

    我对numpy不是很有经验,但根据@hpaulj的评论,我可以提出以下建议: 如果您不想受到numpy.matrix对象的限制(请参见警告here),您可以定义自己的函数来执行共轭转置.你需要做的就是 ...

  6. python自动源码_谷歌推出Tangent开源库,在Python源代码上做自动微分

    原标题:谷歌推出Tangent开源库,在Python源代码上做自动微分 李林 编译自 Google Research Blog 谷歌今天推出了一个新的开源Python自动微分库:Tangent. 和现 ...

  7. python中的tail()_让VASP实现固定应力张量计算的python脚本

    最近在研究指定的应力张量下晶体缺陷的行为.本来想用VASP来进行相应的DFT模拟.但查了半天,发现VASP并不支持指定应力的计算(除非是isotropic的应力). 具体来说,你可以输入一个应变,VA ...

  8. python十大重点_你见过的最全面的 Python 重点

    由于总结了太多的东西,所以篇幅有点长,这也是我'缝缝补补'总结了好久的东西. Py2 VS Py3print成为了函数,python2是关键字 不再有unicode对象,默认str就是unicode ...

  9. python种颜色循环_使用matplotlib颜色图进行颜色循环 - python

    如果我通过以下方式创建颜色: 将numpy导入为np 从matplotlib导入pyplot作为plt n = 6 color = plt.cm.coolwarm(np.linspace(0.1,0. ...

最新文章

  1. GDB 格式化结构体输出
  2. python中的运算符举例_举例讲解Python中的身份运算符的使用方法
  3. 东芝打印机cd40故障_东芝小尺寸UV平板机介绍
  4. “你不明白欣德利 - 米尔纳的哪一部分?”
  5. foreach 语句
  6. 自定义EventSource(一)EventCounter
  7. ASP.NET Core 3.0 gRPC 身份认证和授权
  8. java的传值调用什么_Java的传值调用
  9. yolov3之pytorch源码解析_springmvc源码架构解析之view
  10. [转载] Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例
  11. I00035 完美数(Perfect number)
  12. 3.深入分布式缓存:从原理到实践 --- 动手写缓存
  13. miui11是android几,miui11是安卓几
  14. java加密与解密(一)
  15. 论文阅读之Siamese RPN以及一些其他内容的补充
  16. 元素滚动 scroll 系列
  17. 土方量方lisp_时隔3年,再做双倍超立方数的题目,这次用Lisp
  18. 勇者与羁绊 游戏开发日志(一)
  19. 使用POI 导出word模板文件
  20. 3344avd_AVD生根

热门文章

  1. vue集成汉字转拼音并提取首字母
  2. 《自然语言处理入门》何晗阅读笔记—第1章:自然语言处理基础概念
  3. 计算机专业英语容易挂科吗,大学英语专业容易挂科吗
  4. eclipse 重命名文件、移动文件、删除等操作时出现.svntmp文件
  5. Storport MSI (Message Signaled Interrupts)
  6. RP网页设计中的默认字体:{font: 12px/1.5 Tahoma, Helvetica, Arial, sans-serif;}
  7. 语音识别_ML-KWS-for-MCU_资料整理
  8. java创建短信平台_Java通过SMS短信平台实现发短信功能
  9. linux查看当前网卡网速,Linux环境编程:获取网卡的实时网速
  10. nodejs生成uid