python opencv 读取图片_Python opencv 读取图像
对于 matlab 起家做数字图像处理的人来讲都非常适应matlab对图像处理的操作和思路,尤其是它可以非常方便直观的看到图像的RGB值。
由于最近在研究深度学习的计算机视觉方面的东西,于是完全自学接触到opencv的Python接口,后面需要用到opencv帮助做一些图像处理。但是作为一个自学小白,第一步就被读取数据卡住了一晚上,后来终于想明白了。我查了半天,也没有人对这个显示做过多的说明,可能这个问题太简单了不需要多说,但是毕竟我可能比较笨,所以就由我多嘴来说说这个事。
读取图像代码:
import numpy as np
import cv2
im=cv2.imread("123.png")
print (im)
'''for x in range(10):print (im[1,x])'''
随便截了一张RGB图,读进来,发现是一堆这个。
请原谅我的无知,一开始我确实看不明白这个东西,想了很久,于是打开了matlab也读了进来,后来想明白了。如果大家还是不明白可以自己读入matlab和python做一个对比。
opencv的Python接口对于RGB图像的读入以后化成了标准的numpy数组的形式,但是是多维数组。显示上,他是一个像素一个像素来显示的,一显示就是三个维度也就是【211 101 5】【里面三个值是对应一个像素的】。然后一行一行的显示,由于太多了,中间用...来省略了;每一行显示完了,显示第二行直到最后一行。同时opencv读入的RGB图像显示通道是BGR,也就是第一个211的值其实是B,这一点和MATLAB是不同的,千万注意。
也就是说这个奇葩的显示说的其实是:
第一行第一个像素BGR值为:【211 101 5】 第一行第二个像素BGR值为:【210 100 4】中间太多了省略掉...,即按照以上的形式来显示,第一行倒数第二个是【194 74 8】,第一行最后一个是【194 74 8】,然后第一行显示完了,开始显示第二行。
就这样有省略之后,一直到最后。以上是我做的实验。
下面贴一个整体上详细的介绍:
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中存储的类型为
#读入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呢.
好了,以上系统的介绍是我贴的一个博客上我觉得写的特别好的大神的,链接在Referece中,其中的图太麻烦,我就没贴,想象一下就OK啦
Reference:https://www.cnblogs.com/lynsyklate/p/7720045.htmlwww.cnblogs.com
python opencv 读取图片_Python opencv 读取图像相关推荐
- python怎么打印图片_Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头...
一. 打印图片属性.设置图片存储路径 代码如下: #打印图片的属性.保存图片位置 import cv2 as cv import numpy as np #numpy是一个开源的python科学计算库 ...
- python matplotlib显示图片_Python OpenCV ——Matplotlib显示图片
Color image loaded by OpenCV is in BGR mode.But Matplotlib displays in RGB mode.So color images will ...
- python如何移动图片_python之详细图像仿射变换讲解(图像平移、旋转、缩放、翻转),一文就够了,赶紧码住...
仿射变换简介 什么是放射变换 图像上的仿射变换, 其实就是图片中的一个像素点,通过某种变换,移动到另外一个地方. 从数学上来讲, 就是一个向量空间进行一次线形变换并加上平移向量, 从而变换到另外一个向 ...
- matlab怎么输出图像文件夹,Matlab读取图片 显示和保存图像的相关操作
当前有部份朋友还不清楚Matlab读取图片 显示和保存图像的操作,所以下面绿软吧就带来Matlab读取图片 显示和保存图像的相关操作,一起来看看吧! Matlab读取图片 显示和保存图像的相关操作 打 ...
- php 读取图片bgr,OpenCV读取图像为BGR
OpenCV读取图像为BGR 以下程序演示了如何将彩色图像作为BGR类型图像读取并使用JavaFX窗口显示. 在这里通过将IMREAD_COLOR标志传递给imread()方法以及保存彩色图像路径的S ...
- python opencv 裁剪图片_Python图片裁剪的两种方式——Pillow和OpenCV
在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. OpenCV ...
- python识别图片中方框_Python+Opencv实现鼠标在图片上取色
1.实现效果: 左边是Python代码的运行界面.可以看到在输出行有[249 221 187]三个数字,因为我在右侧的图片上点击了某个区域,因此就输出了所点击区域的RGB颜色.RGB颜色就是三原色,三 ...
- python批量裁剪图片_python通过opencv实现批量剪切图片
上一篇文章中,我们介绍了python实现图片处理和特征提取详解,这里我们再来看看Python通过OpenCV实现批量剪切图片,具体如下. 做图像处理需要大批量的修改图片尺寸来做训练样本,为此本程序借助 ...
- python requests下载图片_python读取图片大小Python Requests模块快速入门
requests是python的一个HTTP客户端库,跟urllib,urllib2类似.它比 urllib 更加方便,可以节约我们大量的工作,它比 urllib 更加 Pythoner. 安装 Re ...
最新文章
- 017——VUE中v-fo指令的使用方法
- TabControl控件和TabPage
- mybatis BindingException: Invalid bound statement (not found)
- 程序员如何掌握新技术与时俱进
- linux memcacheQ的安装与使用
- Https iOS需要做的事
- Ajax,ajaxFileUpload文件上传同步代码js实现
- Python自省 type(),dir(),getattr(),hasattr(),isinstance().
- C核心技术手册(四十五)
- jquery 文档就绪
- 脉歌蓝牙耳机线评测_感受震撼,更贴耳的蓝牙耳机,脉歌MT70让你感受超值音效...
- mysql数据库性能监控工具MONyog实战
- c语言自定义结构,C语言如何定义结构体
- 过去式和现在完成时区别
- 蓝桥杯之单片机学习(三)——共阳数码管的静态显示
- linux离线安装redmine_举个栗子!Tableau 技巧(97):离线安装 Linux 版 Tableau Server...
- iOS逆向工程——获取app素材图片
- burpsuit 抓取https包,证书问题,此证书已在此前安装为一个证书权威机构
- 南卡蓝牙耳机和JBL蓝牙耳机哪个更值得买?音质最好的蓝牙耳机测评
- Bzoj 1596: [Usaco2008 Jan]电话网络