用python完成图形输出设备_使用numpy进行9宫格图像拼接 - Python
本节内容要用到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编程基础及应用_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.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编程基础及应用 — 重庆大学 高等教育出版社,作者亲授_哔哩哔哩 (゜-゜)つロ 干杯~-bilibiliwww.bilibili.com版权声明 本文可以在互联网上自由转载,但必须:注明出处(作者:海洋饼干叔叔)并包含指向本页面的链接。 本文不可以以纸质出版为目的进行改编、摘抄。
用python完成图形输出设备_使用numpy进行9宫格图像拼接 - Python相关推荐
- python降低图片分辨率_使用numpy快速降低图像分辨率的Python代码
我首先要说的是,你的"只装箱"方式似乎很不寻常,我想这正是@ljetibo在评论中所指的.在"优化"讨论之后,我将回到这个话题.在 首先,您可以通过去掉对np. ...
- 使用numpy进行9宫格图像拼接
本节内容要用到opencv-python模块,请先行安装.本例程中使用到的图片保存在pictures子目录下.本例的任务是要将9张JPG格式图片按三行三列拼接成下述九宫格. 版权声明 本文可以在互联网 ...
- python基本图形绘制_【Python】Python基本图形绘制-Go语言中文社区
1.Python蟒蛇图形绘制: 代码: #PythonDraw.py import turtle turtle.setup(650, 350, 200, 200) turtle.penup() tur ...
- python简单图形输出_基于 Python Matplotlib 模块的高质量图形输出
Matplotlib 是一个由 John Hunter 等开发的,用以绘制二维图形的 Python 模块.它利用了 Python 下的数值计算模块 Numeric 及 Numarray,克隆了许多 M ...
- python怎么取共轭_自用numpy语法的共轭转置
我对numpy不是很有经验,但根据@hpaulj的评论,我可以提出以下建议: 如果您不想受到numpy.matrix对象的限制(请参见警告here),您可以定义自己的函数来执行共轭转置.你需要做的就是 ...
- python自动源码_谷歌推出Tangent开源库,在Python源代码上做自动微分
原标题:谷歌推出Tangent开源库,在Python源代码上做自动微分 李林 编译自 Google Research Blog 谷歌今天推出了一个新的开源Python自动微分库:Tangent. 和现 ...
- python中的tail()_让VASP实现固定应力张量计算的python脚本
最近在研究指定的应力张量下晶体缺陷的行为.本来想用VASP来进行相应的DFT模拟.但查了半天,发现VASP并不支持指定应力的计算(除非是isotropic的应力). 具体来说,你可以输入一个应变,VA ...
- python十大重点_你见过的最全面的 Python 重点
由于总结了太多的东西,所以篇幅有点长,这也是我'缝缝补补'总结了好久的东西. Py2 VS Py3print成为了函数,python2是关键字 不再有unicode对象,默认str就是unicode ...
- python种颜色循环_使用matplotlib颜色图进行颜色循环 - python
如果我通过以下方式创建颜色: 将numpy导入为np 从matplotlib导入pyplot作为plt n = 6 color = plt.cm.coolwarm(np.linspace(0.1,0. ...
最新文章
- GDB 格式化结构体输出
- python中的运算符举例_举例讲解Python中的身份运算符的使用方法
- 东芝打印机cd40故障_东芝小尺寸UV平板机介绍
- “你不明白欣德利 - 米尔纳的哪一部分?”
- foreach 语句
- 自定义EventSource(一)EventCounter
- ASP.NET Core 3.0 gRPC 身份认证和授权
- java的传值调用什么_Java的传值调用
- yolov3之pytorch源码解析_springmvc源码架构解析之view
- [转载] Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例
- I00035 完美数(Perfect number)
- 3.深入分布式缓存:从原理到实践 --- 动手写缓存
- miui11是android几,miui11是安卓几
- java加密与解密(一)
- 论文阅读之Siamese RPN以及一些其他内容的补充
- 元素滚动 scroll 系列
- 土方量方lisp_时隔3年,再做双倍超立方数的题目,这次用Lisp
- 勇者与羁绊 游戏开发日志(一)
- 使用POI 导出word模板文件
- 3344avd_AVD生根
热门文章
- vue集成汉字转拼音并提取首字母
- 《自然语言处理入门》何晗阅读笔记—第1章:自然语言处理基础概念
- 计算机专业英语容易挂科吗,大学英语专业容易挂科吗
- eclipse 重命名文件、移动文件、删除等操作时出现.svntmp文件
- Storport MSI (Message Signaled Interrupts)
- RP网页设计中的默认字体:{font: 12px/1.5 Tahoma, Helvetica, Arial, sans-serif;}
- 语音识别_ML-KWS-for-MCU_资料整理
- java创建短信平台_Java通过SMS短信平台实现发短信功能
- linux查看当前网卡网速,Linux环境编程:获取网卡的实时网速
- nodejs生成uid