使用python开启你的opencv之旅---图像的读入,存储
python的便捷是如此的引人着迷,而opencv给python提供的接口使我们能够使用python来快速验证我们的想法,或者与别的模块快速结合,在这个系列文章我会通过jupyter notebook来快速展示opencv的使用
#在开头引入必要的库
import matplotlib.pyplot as plt
import numpy as np
import cv2
#ipython
%matplotlib inline
图像读取
opencv使用imread读取图片,imshow显示图片,但是对于我而言,常使用jupyter作为展示的工具,imshow在浏览器环境中就失去了它的作用,因此我会使用matplotlib来展示
#读取一张图片
cv2.imread(img,flag)
#img这一参数中填入图片的完全路径或者相对路径
这里我们需要稍微了解下flag这个参数,这决定了opencv是如何读入我们的图像的
我们知道通常图像每个像素点的颜色我们以RGB的格式来描述(或者RGBA),可以通过三基色(red,green,blue)来描述所有颜色,对于透明图片我们会增加一个a(alpha)来描述其颜色的透明度.
cv2.IMREAD_COLOR : 读入图片,任何与透明度相关通道的会被忽视,默认以这种方式读入.
cv2.IMREAD_GRAYSCALE : 以灰度图的形式读入图片.
cv2.IMREAD_UNCHANGED : 保留读取图片原有的颜色通道.
可以简单的用-1,0,1来分别表示这3个flag
就让我们从著名的lenna图开始吧
lenna_img = cv2.imread("lena.jpg")
plt.imshow(lenna_img)
plt.axis("off")#去除坐标轴
plt.show()

当把这张图片打印出来后,你一定在疑惑,咦,这张图怎么变青色了?
原因就在于opencv默认的imread是以BGR的方式进行存储的,而matplotlib的imshow默认则是以RGB格式展示,所以此处我们必须对图片的通道进行转换
lenna_img = cv2.cvtColor(lenna_img,cv2.COLOR_BGR2RGB)
plt.imshow(lenna_img)
plt.axis("off")
plt.show()

Lenna终于恢复了她的本来样子了
这里我们了解一下cvtColor这个函数,它的第一个参数是图片,第二个参数则是颜色通道的转化方式
它的命名是有规律的通常以COLOR作为开头,后面则跟着它的转化方式,BGR通道转化为RGB,因此就是cv2.COLOR_BGR2RGB
你可以试着猜测从RGB通道转化为BGR通道的api名,通过补全验证你的想法
我们在刚刚使用了默认的flag读入了图片,那么让我们用用另外两个试试效果
gray_lenna_img = cv2.imread("lena.jpg",0)
orign_lenna_img = cv2.imread("lena.jpg",1)
plt.subplot(121)
plt.imshow(gray_lenna_img,cmap=plt.cm.gray)
plt.axis("off")
plt.subplot(122)
orign_lenna_img = cv2.cvtColor(orign_lenna_img,cv2.COLOR_BGR2RGB)
plt.imshow(orign_lenna_img)
plt.axis("off")
plt.show()

因为lenna图并没有包含透明度这一通道,读入的仍然是BGR格式,所以我们从lenna图是看不出区别的
图片在python下的储存方式
opencv的一个Image对象在python和C下的存储方式是不同的,在c下,通过opencv实现的Mat来进行存储,而python下则基于numpy
numpy对于使用python进行科学计算的人都不算陌生,它为python提供了一个高效的矩阵运算模块.
这就意味着我们可以直接使用numpy的api对图片进行计算和处理.
print("Lenna图在python中存储的类型为",type(lenna_img))
print("读入lenna图的shape为",lenna_img.shape)
print("以灰白图读入lenna图的shape为",gray_lenna_img.shape)
#Lenna图在python中存储的类型为 <class 'numpy.ndarray'>
#读入lenna图的shape为 (512, 512, 3)
#以灰白图读入lenna图的shape为 (512, 512)
上文实现的bgr装RGB我们也可以使用numpy来轻松的实现
lenna_img = cv2.imread("lena.jpg")
b,g,r = cv2.split(lenna_img)
lenna_img = cv2.merge([r,g,b])
plt.imshow(lenna_img)
plt.axis("off")
plt.show()
#结果如下

我们可以对之前的函数进行一些包装,毕竟每次都要设定坐标轴为off怎么也会厌烦的啊
def show_cv_img(cv_image):
image = cv2.cvtColor(cv_image,cv2.COLOR_BGR2RGB)
plt.imshow(image)
plt.axis("off")
考虑到subplot此处没有直接plt.show
show_cv_img(cv2.imread("lena.jpg"))#jupyter result

图片的展示与存储
虽然说我们通常使用jupyter来使用opencv,但还是要了解下opencv默认的imshow
img = cv2.imread("lenna.jpg")
cv2.namedWindow('image', cv2.WINDOW_NORMAL)#给显示的窗口命名,后面的flag默认为cv2.WINDOW_AUTOSIZE,自动调整边框
#,但是在条形图过长时,使用windownormal我们可以自行调整边框
cv2.imshow('image',img)#展示图片
cv2.waitKey(0)#等待按键按下
cv2.destroyAllWindows()#清除所有窗口
我们可以使用imwrite来存储一张图片,接受一个numpy的数组作为参数.
cv2.imwrite('cope_lenna_img.jpg',lenna_img)
#result: True
他会返回一个bool值来表示它是否成功存储.
我们成功在当前目录存储了一个叫做copy_lenna_img.jpg的图像.
Warning:
注意后缀.你的后缀是jpg还是png决定它以怎样的方式保存
Opencv对于图像的读入和存储都已经封装好了给我们,是我们能够轻松的读入,存储,避免去了解图片文件的格式才能读取,存储图片,但仅仅这样显然不是opencv的真正面目,还不如直接用pillow呢.
那么Opencv到底NB在哪里呢?
使用python开启你的opencv之旅---图像的读入,存储的更多相关文章
- Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅
通过 Docker 化一个博客网站来开启我们的 Docker 之旅 这篇文章包含 Docker 的基本概念,以及如何通过创建一个定制的 Dockerfile 来 Docker 化Dockerize一个 ...
- 关于python环境下的opencv安装
吐槽: 这一天我终于记起了这个博客.今天搞python环境下的opencv,又弄了一天,很烦躁.之前配置VS的opencv也是花了好久的时间,然后突然发现之前记录在电脑上的文档都找不到了,于是决定还是 ...
- python开启简单webserver
python开启简单webserver linux下面使用 python -m SimpleHTTPServer 8000 windows下面使用上面的命令会报错,Python.Exe: No Mod ...
- 开启ucosii的移植之旅
开启ucosii的移植之旅: 4.6.1.移植和硬件平台的关系 (1)只要是cortex-m3内核内核的soc移植差异都不大. 同内核同soc的不同开发板移植差异都不大. 不同内核的开发板移植难度大, ...
- 【python基础】python开启GPU加速
前言 训练时使用GPU可以加速程序运行,本文介绍如何使用GPU加速. 前提条件 1. 机子有GPU显卡,并安装GPU显卡驱动: 2. 安装GPU的使用环境,CUDA等: 3. 打开nvidia-smi ...
- python之OpenCv(二)---保存图像
1.使用opencv保存图像 cv2.imwrite(存储路径,图像变量[,存盘标识]) 存盘标识: cv2.CV_IMWRITE_JPEG_QUALITY 设置图片格式为.jpeg或者.jpg的图 ...
- Python用Pillow(PIL)进行简单的图像操作
Python用Pillow(PIL)进行简单的图像操作 颜色与RGBA值 计算机通常将图像表示为RGB值,或者再加上alpha值(通透度,透明度),称为RGBA值.在Pillow中,RGBA的值表示为 ...
- opencv提取截获图像(总结摘来)
opencv提取截获图像(总结摘来) http://blog.csdn.net/wuxiaoyao12/article/details/7305865 版权声明:本文为博主原创文章,未经博主允许不得转 ...
- opencv批处理提取图像的特征
____________________________________________________________________________________________________ ...
随机推荐
- python request 接口测试get和post请求
开发IDE:pycharm python:2.7.10 get请求 # coding: UTF-8 #兼容中文字符,如果没有这句,程序中有中文字符时,运行会报错 import requests #引用 ...
- CentOS7.5 安装部署Apache+Mysql+Php
系统:CentOS7.5 安装Apache 安装 yum -y install httpd 开启apache服务 systemctl start httpd.service 设置apache服务开机启 ...
- hdu 4619 Warm up 2 (二分匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4619 题意: 平面上有一些1×2的骨牌,每张骨牌要么水平放置,要么竖直放置,并且保证同方向放置的骨牌不 ...
- Erlang/Elixir精选-第4期(20191223)
精选文章 A digital symphony - The architecture of API Fortress. 使用Actor模型来支持基于微服务的大规模分布式软件架构.用实例解释了Actor ...
- ubuntu软件源变更阿里源和arm板子变更国内源
使用 lsb_release -c 命令,看看当前版本号,替换一下“bionic”字符 1.更改 /etc/apt/sources.list,更改之前先备份一下 deb http://mirrors. ...
- boost location-dependent times
1. local_date_time #include <boost/date_time/local_time/local_time.hpp> #include <iostream& ...
- JDK1.7 hashMap源码分析
了解HashMap原理之前先了解一下几种数据结构: 1.数组:采用一段连续的内存空间来存储数据.对于指定下标的查找,时间复杂度为O(1),对于给定元素的查找,需要遍历整个数据,时间复杂度为O(n).但 ...
- Android开发新手常见的10个误区
在过去十年中最流行的移动应用开发开发平台中,我们认为,Android平台是一个新开发的最方便的平台.一个廉价的工具,友好的开发者社区,众所周知的编程语言(Java),使得开发Android应用程序从未 ...
- HDU 6090 Rikka with Graph —— 2017 Multi-University Training 5
Rikka with Graph Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 【PBFT】拜占庭容错
共识机制堪称区块链的核心.我们知道,EOS.Hyperledger以及Stellar等著名的项目,都采用了BFT(拜占庭容错)共识机制,那么,BFT到底是什么鬼?和其它共识机制相比,又有什么优势和特点 ...