cv2入门函数imread及其相关操作

写于2021.04.21 23时

目录

1.dlib、cv2的安装

2.imread()相关参数,及其操作

3.修改图片大小

4如何处理中文路径问题

小声提醒一句:干货在后面!

安装

这里我们使用到的是dlib库的imread()函数
首先就是dlib库的安装
安装之前,需要安装依赖的库,cmake、boost
可参考下面的命令,使用win+R打开终端,一次输入下面的命令即可

pip install cmake  -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install boost  -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install dlib  -i https://pypi.tuna.tsinghua.edu.cn/simple
安装时可能会报错,例如:
ERROR: Command errored out with exit status 1:
 ERROR: CMake must be installed to build dlib
 等等,如果需要的话会专门写一篇,来解决类似的问题,欢迎留言

装好之后,我可以尝试着导入库

import cv2 
import dlib 

不报错,就是成功了
然后就可以使用cv2库中的imread()函数了
使用方法,例:
注意:路径不能有中文,不然会报错!!!

img = cv2.imread("./img_1.png")  #./img_1.png为需要读取图片的路径

这里我们就需要了解一下这个imread()函数的参数了

imread为image read的缩写,即图像读取的意思
imread(const string& filename,int flag);
参数一:const string& filename 传入参数为文件名字。
  支持图片格式:
  1、windows位图:*.bmp,*.dib;
  2、JPEG文件:*.jpg,*.jpe,*.jpeg;
  3、JPEG 2000 文件;
  4、PNG 图片:*.png;
  5、便携文件格式;
  6、Sun rasters;
  7、TIFF文件;
参数二:int flag参入参数
	cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道
	cv2.IMREAD_GRAYSCALE:读入灰度图片
	cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道
	也可以写成如下:
  取值0,将图像转化为灰图;
  取值2,原深度图像;
  取值4,原颜色图像;
  取值1为彩图
  一般来说:取值<0 Alpha通道加载图像,=0为灰图。
cv2.imread在不加第二个参数的情况下默认将图片转换成了一个三维数组,最里面的一维代表的是一个像素的三个通道(BGR)的灰度值,第二个维度代表的是每一行所有像素的灰度值,第三个维度,也就是最外面的一个维度代表的是这一张图片

由此我们可以知道,读取之后的第二维长度为图片的宽(高)

cv2.imread()读取的是B、G、R(红、绿、蓝)一般取值范围0~255
通过cv2.imread()读取图片
经过测试发现读取图片的长度为宽
140*146  长度为146
450*165 长度为165
img = cv2.imread("./nm0000111_rm4828928_1962-3-21_2009.jpg") #./nm0000111_rm4828928_1962-3-21_2009.jpg为图片路径

到这里就已经掌握了cv2imread()这个函数,一定要注意读取的顺序是BGR,skimage.io.imread()读取的是RGB,混用的话可能会导致图片显示异常
我们可以做一个转换,来实现图片正常显示的功能
源码如下:

path='./img_1.png'
image = cv2.imread(path)
cv2.imshow("image",image)
cv2.waitKey(0)
# 将图像通道分离开。
b, g, r = cv2.split(image)
# 以RGB的形式重新组合。
rgb_image = cv2.merge([r, g, b])
skimage.io.imshow(rgb_image)
io.show()

经过转换后可以正常显示,下方也会用到这一部分的内容


使用

了解了imread()函数的一些组成要素之后,接下来就是如何使用了,读取一张图片,显示出来
最基本的操作如下

import cv2
path='./img_1.png'#可以随意修改,一定位图片路径,不然会报错
img=cv2.imread(path)
cv2.imshow("img_1",img)#常见一个界面,用来显示图片
cv2.waitKey(0)#必不可少,少了就无法看到显示的图片,此句的主要目的是一直等待,直到有按键按下,才会销毁创建的界面(前提时鼠标在界面上)
----------------------------------------------------------------------------------------------
#当你想按指定键,来关闭显示图片的窗口界面时,我们可以指定按键,操作如下:
import cv2
path='./img_1.png'
img=cv2.imread(path)
cv2.imshow("img_1",img)#两个参数,前面的呢个是窗口界面的名称,后面的呢个是要显示的图片,参数不可少
p=cv2.waitKey(0)
if p=="p":#经过实验大小写,不影响,最好是切换到英文输入法,中文状态下,不可行(小编失败了),也可以==一个数字,这个数字是按键的号,可自行搜索查看
    cv2.destroyWindow()

显示图片不止这一种方法,我们也可以先创建一个类似于windows的界面,然后把图片放进去

import dlib
import cv2
import imageio

w=dlib.image_window()
#img=cv2.imread('./img_1.png')#使用此语句,是效果二
img=imageio.imread('./img_1.png')
w.set_image(img)
dlib.hit_enter_to_continue()

效果图1
在这里插入图片描述
效果二:
在这里插入图片描述
很明显效果不一样,原因就在于读取R、G、B的顺序不同
使用dlib先创建一个窗口,再放图片,很明显顺序为RGB,而不是GBR,我们可以做一个转换,也可以使用别的方式来读取,例如imageio.imread(),skimage库中的io.imread(),都是可以的,只需要注意读取的一个顺序


另一种放置图片的方式
import cv2

cv2.namedWindow("img_1",cv2.WINDOW_NORMAL)#窗口大小自适应图片,用户不可改变
cv2.waitKey(0)

我们就创建了一个名为img_1的窗口,然后就可以进行下一步操作了


import cv2
img= cv2.imread("./img_1.png")
cv2.namedWindow("img_1",cv2.WINDOW_NORMAL)
cv2.resizeWindow("img_1",255,255)#这里可以设置窗口的大小,名称须保持一致
cv2.imshow("img_1",img)#第一个参数为窗口名称,须与创建的窗口名称一致,不一致不会显示在创建的窗口,而是重新创建名为第一个参数的窗口,且大小为图片的大小
cv2.waitKey(0)

效果图:
名称一样
在这里插入图片描述
名称不一样
在这里插入图片描述

自定义图片大小

我们可以先创建一个窗口,调整大小,然后把图片放进去,就是上面呢个例子
也可以设置图片的大小
通过resize()这个函数

cv2.resize时,参数输入是 宽×高×通道 可参考opencv: cv2.resize 探究(源码)

cv2.resize(src,dsize,dst=None,fx=None,fy=None,interpolation=None)
scr:原图
dsize:输出图像尺寸
fx:沿水平轴的比例因子
fy:沿垂直轴的比例因子

interpolation:插值方法
interpolation 选项		所用的插值方法
INTER_NEAREST			最近邻插值
INTER_LINEAR			双线性插值(默认设置)
INTER_AREA				使用像素区域关系进行重采样。 它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。 但是当图像缩放时,它类似于INTER_NEAREST方法。
INTER_CUBIC				4x4像素邻域的双三次插值
INTER_LANCZOS4			8x8像素邻域的Lanczos插值

示例:

import cv2
path="./img_1.png"
img=cv2.imread(path)
img1=cv2.resize(img,(250,250),interpolation=cv2.INTER_NEAREST)#设置图片大小为250*250,可自定义,也可按照比例缩放,前提的需要知道照片的宽和高
cv2.imshow("img_1",img1)
cv2.waitKey(0)

效果图:
图片来自于网络
按照比例进行缩放

import cv2
path="./img_1.png"
img=cv2.imread(path)
height,width = img.shape[:2]  #获取原图像的水平方向尺寸和垂直方向尺寸。
img1=cv2.resize(img,(int(width/2),int(height/2)),interpolation=cv2.INTER_NEAREST)#这里设置的是,宽和高都减少一倍,即缩放1/2,这里做了一个强制转换,因为/2之后,可能为浮点型,设置大小是必须为整数型
cv2.imshow("img_2",img1)
cv2.imshow("img_1",img)
cv2.waitKey(0)

效果图:
在这里插入图片描述

小提一下

如何处理中文路径问题

def cv_imread(file_path): #使用之前需要导入numpy、cv2库,file_path为包含中文的路径
    return cv2.imdecode(np.fromfile(file_path, dtype=numpy.uint8), cv2.IMREAD_COLOR)

可以调用这个函数,如果路径中存在中文的话,就可以解决!


欢迎在下方留下宝贵的足迹!


以上就是imread()的相关操作,可能不全,请谅解!
以上提到的方法中有的不止一种实现方式,可能有好多种,我们只需掌握其中的一种即可,不需要完全掌握!
注:
图片来源于网络,如有侵权,通知即删!
个人感觉很帅(不喜勿喷!)

完毕于2021.04.22 10:21

  • 31
    点赞
  • 184
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trust Tomorrow

感谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值