opencv——基础篇
一 . opencv是什么及其作用?
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法(百度百科)。
鉴于本人的工作环境主要是采用python作为开发工具,故本篇博客是基于python来做的学习记录。
二 . 环境依赖和opencv包
- 环境:python3.7+windows10
- 包:opencv-python、opencv-contrib-python
- 说明:装好python以后,直接在cmd里面使用pip install 即可,若遇见下载速度过慢或超时的情况,建议换个pip源,使用方式如:pip install package -i https://pypi.tuna.tsinghua.edu.cn/simple/
三 . 基本使用
前提:准备若干张图片到本地
都知道一张图片是由很多个像素点组成,对于计算机而言,最终呈现在用户面前的是由每个像素点的值所决定(0~255),0对应黑色,255对应白色。我们在生活中通常接触的都是彩色图片,由RGB三通道共同构成一张上面的彩色图片,每一个通道对应的像素值反映出其亮度(三个通道可以理解成三个矩阵)。而灰度图像通常只有一个颜色通道来表现。
1. 读取图片,将其转换为数组
from matplotlib import pyplot as pyl
import cv2
import numpy img = cv2.imread("cat.jpg") #img是一个numpy.ndarray对象,默认是以BGR三通道读取图片数据(三维数组)
#img_gray = cv2.imread("cat.jpg",cv2.IMREAD_GRAYSCALE) 以灰度图像方式读取图片数据(二维数组)
2. 数组数据转换
img_BGR = cv2.imread("cat.jpg")
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #将其转换为灰度的二维数组数据
3. 数组数据窗口展示
img = cv2.imread("cat.jpg") cv2.imshow("IMage",img)
cv2.waitKey(0) # 按任意键关闭窗口,cv2.waitKey(1000) 延时一秒关闭窗口
cv2.destroyAllWindows()
4. 图像保存
cv2.imwrite("mycat.jpg",img)
5. 图像的截取
# 其实本质就是对np数组进行操作
img = cv2.imread("cat.jpg")
cv2.imshow("IMage",img[:100,:200]) # 取前100行,前200列的像素作为图像展示
6. BGR数据切片
img = cv2.imread("cat.jpg") # 切片
b,g,r = cv2.split(img) # 得到各自颜色通道的二维数组数据 # 合并
img = cv2.merge(b,g,r)
7 同样大小的数组像素值运算
img = cv2.imread("cat.jpg")
img_2 = numpy.copy(img) # np相加,像素值只要超过255,就减掉255,比如257,结果就为2
print(img[:3,:3,0]+img_2[:3,:3,0] ) # cv2相加,像素值超过255,就等于255
print(cv2.add(img[:3,:3,0],img_2[:3,:3,0]))
8 图片的融合
img_cat = cv2.imread("cat.jpg")
img_dog = cv2.imread("dog.jpg") ret = cv2.addWeighted(img_cat,0.2,img_dog,0.8,0) # 数据后面的值决定图片融合和所占的权重
cv2.imshow("IMage",ret)
cv2.waitKey(0) # 按任意键关闭窗口,cv2.waitKey(1000) 延时一秒关闭窗口
cv2.destroyAllWindows() # 如果图片大小不一致,使用cv2.resize(img_xx,(300,200)) ————》转换为np.shape = 200,300的数组
9 图片的比例缩放
img_cat = cv2.imread("cat.jpg") ret = cv2.resize(img_cat,(0,0),fx=3,fy=1) #横向拉长三倍
ret2 = cv2.resize(img_cat,(0,0),fx=3,fy=3) #图片扩大三倍
结语:本来准备认真写一下结尾的,毕竟作为博客园的新人,写下第一篇学习笔记应当是值得纪念的一件事儿,不过想了想,这要是最后一篇那岂不是太尴尬了。嗯,作为一名不太合格的码农,我大多时候是很抗拒写笔记的,其实毕业工作也已经一年多了,一直也来也都知道一个好的学习习惯是多么重要。所以,我希望自己能改变的更快一点,能变得更加优秀,更加有底气的去尝试,去做自己觉得有意义真正想去做的事情。
—— 2019-09-10 00:14:45
最新文章
- Sublime Text3 BracketHighlighter高亮色彩配置
- 可变长子网掩码 VLSM
- Java判断Class变量是什么类型
- 实用技巧:使用 jQuery 异步加载 JavaScript 脚本
- 【HDU 2874】Connections between cities(LCA)
- Maven项目自动生成mybaties配置文件
- MVC 全局异常处理及禁用显示头
- jboss7 添加虚拟目录 上传文件路径
- log4j+logback+slf4j+commons-logging的关系与调试
- 从零开始学ios开发(五):IOS控件(2),Slider
- 深入了解 Dojo 的服务器推送技术
- A - Wireless Network-poj2236(简单并查集)
- spring+springmvc+maven+mybatis整合
- 如何设置linux的文件和目录的权限
- C#-MVC开发微信应用(2)--OAuth2.0网页授权
- Lastpass——密码管理工具
- ccf认证 201709-4 通信网络 java实现
- OAuth 2.0 认证的原理与实践
- DirectX11 With Windows SDK--12 深度/模板状态、平面镜反射绘制
- Linux下的快捷键
热门文章
- Django--实现分页功能,并且基于cookie实现用户定制每页的数据条数
- Dubbo入门到精通学习笔记(五):持续集成管理平台之sonarqube代码质量管理平台的介绍与安装
- prototype.原型链.原型链图
- C++子类父类构造函数的关系
- 构造+数位dp
- Linux文件介绍
- 实现简单的PHP接口,以及使用js/jquery ajax技术调用此接口
- PHP 类中静态方法调用非静态方法
- django 模型ManyToMany 关联的添加,删除,查询
- delphi xe10 文件目录/路径操作 (Andorid、ios)