javaweb通过img绝对路径读取图片_Python opencv 读取图像

对于 matlab 起家做数字图像处理的人来讲都非常适应matlab对图像处理的操作和思路,尤其是它可以非常方便直观的看到图像的RGB值。

由于最近在研究深度学习的计算机视觉方面的东西,于是完全自学接触到opencv的Python接口,后面需要用到opencv帮助做一些图像处理。但是作为一个自学小白,第一步就被读取数据卡住了一晚上,后来终于想明白了。我查了半天,也没有人对这个显示做过多的说明,可能这个问题太简单了不需要多说,但是毕竟我可能比较笨,所以就由我多嘴来说说这个事。

读取图像代码:

import 

随便截了一张RGB图,读进来,发现是一堆这个。

75f04132ce6f233fe8746f3747ecc0b2.png

请原谅我的无知,一开始我确实看不明白这个东西,想了很久,于是打开了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的使用

#在开头引入必要的库

图像读取

opencv使用imread读取图片,imshow显示图片,但是对于我而言,常使用jupyter作为展示的工具,imshow在浏览器环境中就失去了它的作用,因此我会使用matplotlib来展示

#读取一张图片

这里我们需要稍微了解下flag这个参数,这决定了opencv是如何读入我们的图像的

我们知道通常图像每个像素点的颜色我们以RGB的格式来描述(或者RGBA),可以通过三基色(red,green,blue)来描述所有颜色,对于透明图片我们会增加一个a(alpha)来描述其颜色的透明度.

cv2

可以简单的用-1,0,1来分别表示这3个flag

就让我们从著名的lenna图开始吧

lenna_img 

当把这张图片打印出来后,你一定在疑惑,咦,这张图怎么变青色了?

原因就在于opencv默认的imread是以BGR的方式进行存储的,而matplotlib的imshow默认则是以RGB格式展示,所以此处我们必须对图片的通道进行转换

lenna_img 

Lenna终于恢复了她的本来样子了
这里我们了解一下cvtColor这个函数,它的第一个参数是图片,第二个参数则是颜色通道的转化方式
它的命名是有规律的通常以COLOR作为开头,后面则跟着它的转化方式,BGR通道转化为RGB,因此就是cv2.COLOR_BGR2RGB
你可以试着猜测从RGB通道转化为BGR通道的api名,通过补全验证你的想法

我们在刚刚使用了默认的flag读入了图片,那么让我们用用另外两个试试效果

gray_lenna_img 

因为lenna图并没有包含透明度这一通道,读入的仍然是BGR格式,所以我们从lenna图是看不出区别的

图片在python下的储存方式

opencv的一个Image对象在python和C++下的存储方式是不同的,在c++下,通过opencv实现的Mat来进行存储,而python下则基于numpy

numpy对于使用python进行科学计算的人都不算陌生,它为python提供了一个高效的矩阵运算模块.

这就意味着我们可以直接使用numpy的api对图片进行计算和处理.

print

上文实现的bgr装RGB我们也可以使用numpy来轻松的实现

lenna_img 

我们可以对之前的函数进行一些包装,毕竟每次都要设定坐标轴为off怎么也会厌烦的啊

def 

考虑到subplot此处没有直接plt.show

show_cv_img

图片的展示与存储

虽然说我们通常使用jupyter来使用opencv,但还是要了解下opencv默认的imshow

img 

我们可以使用imwrite来存储一张图片,接受一个numpy的数组作为参数.

cv2

他会返回一个bool值来表示它是否成功存储.
我们成功在当前目录存储了一个叫做copy_lenna_img.jpg的图像.

Warning:

注意后缀

Opencv对于图像的读入和存储都已经封装好了给我们,是我们能够轻松的读入,存储,避免去了解图片文件的格式才能读取,存储图片,但仅仅这样显然不是opencv的真正面目,还不如直接用pillow呢.

好了,以上系统的介绍是我贴的一个博客上我觉得写的特别好的大神的,链接在Referece中,其中的图太麻烦,我就没贴,想象一下就OK啦

Reference:

https://www.cnblogs.com/lynsyklate/p/7720045.html​www.cnblogs.com
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值