无论我们想要学习如何将面部识别应用于视频流,还是用深度学习构建图像分类器,或者做其他一些有关图像识别的有趣项目,可能都会需要学一些OpenCV的知识,本文将做简单介绍。

加载和显示图像

保存上面的图片,打开你最爱的编辑器,输入以下代码:

import cv2image = cv2.imread('demo.jpg')
cv2.imshow('Image', image)
cv2.waitKey()

第3行,使用cv2.imread()导入图像。

第4行,使用cv2.imshow()显示图像。窗口会自动调整为图像大小。第一个参数是窗口的名字,然后是我们的图像。

第5行,使用cv2.waitKey()等待键盘输入。

运行一下,结果如下所示:

获取并修改像素值

我们可以先查看一下图像的形状,

print(image.shape)## (600,400,3)

image.shape可以获取图像的形状。返回的是一个包含行数(高),列数(宽),通道数的元组。

可以根据像素的行、列坐标获取其像素值。对于BGR图像来说,返回值为B,G,R的值。对灰度图像来说,返回值为其灰度值。

B,G,R = image[320,15]
print('B={}, G={}, R={}'.format(B,G,R))## B=150, G=172, R=197

可以用类似的方式修改像素值,

image[320,15] = [52,26,16]
B,G,R = image[320,15]
print('B={}, G={}, R={}'.format(B,G,R))## B=52, G=26, R=16

图像ROI

有时我们需要对一幅图像的感兴趣的区域(Regions of Interest,ROI)进行操作。比如,我们要检测一幅图像中眼睛的位置,我们首先应该在图像中找到脸,再在脸的区域中找眼睛,而不是直接在一幅图像中搜素。ROI也是通过索引获得,其实就相当于数组切片。

import cv2image = cv2.imread('demo.jpg')
head = image[27:124,159:260]
image[200:297,299:400] = head
cv2.imshow('New', image)
cv2.waitKey()

结果如下:

图像缩放

OpenCV提供的函数cv2.resize()可以改变图像的尺寸大小。

import cv2image = cv2.imread('demo.jpg')
resized = cv2.resize(image, (200,400))
cv2.imshow('Image', resized)
cv2.waitKey()

旋转图像

对一个图像旋转角度 θ \theta θ,需要用到下面形式的旋转矩阵。


OpenCV允许我们在任意地方进行旋转,于是旋转矩阵的形式应该改为:

其中:

为了构建这个旋转矩阵,OpenCV提供了一个函数:cv2.getRotationMatrix2D()
以下便是在不缩放的情况下将图像旋转90度。

import cv2image = cv2.imread('demo1.jpg')
rows,cols,depth = image.shape
M = cv2.getRotationMatrix2D((rows // 2, cols // 2), 90, 1)
dst = cv2.warpAffine(image,M,(cols,rows))
cv2.imshow('Image', dst)
cv2.waitKey()

第5行,第一个参数为旋转中心,第二个参数为旋转角度,第三个为旋转后的缩放因子。

第6行,第三个参数是输出图像的尺寸。

图像模糊

在许多的图像处理过程中,我们必须模糊图像以减少高频噪声,使算法更容易检测和理解图像的实际内容。在OpenCV中模糊图像非常容易,有很多方法可以用。

import cv2image = cv2.imread('demo1.jpg')
blurred = cv2.GaussianBlur(image, (11, 11), 0)
cv2.imshow('Blurred', blurred)
cv2.waitKey()

第4行,我们使用了高斯模糊,用了11 x 11的核。

较大的核会产生更模糊的图像,较小的核将产生没那么的模糊图像。

绘图函数

本节我们将在导入的图像上画矩形,圆,线以及添加文字。但值得注意的是,这些操作会影响到原始导入的image,为了避免这样,我们可以用image的副本进行操作。

import cv2image = cv2.imread('demo.jpg')
output = image.copy()
cv2.rectangle(output, (163, 30), (244, 124), (0, 0, 255), 2)
cv2.imshow('Rectangle', output)
cv2.waitKey()

第5行,设置的参数如下:

  • img:想要绘制图像的那幅图像,这里是output
  • pt1:矩形左上角坐标,这里是(163, 30)
  • pt2:矩形右下角坐标,这里是(244, 124)
  • color:BGR元组,这里是红色(0,0,255)
  • thickness:线条粗细(如果一个闭合图形设置为负数,那么这个图形就会被填充),这里是2

结果如下:

接下来,我们在猫咪的图像上画一个圆。

import cv2image = cv2.imread('demo1.jpg')
output = image.copy()
cv2.circle(output, (32, 25), 20, (255,0,0),-1)
cv2.imshow('Circle', output)
cv2.waitKey()

要画圆的话,需要指定圆形的圆心坐标和半径大小。

第5行,我们指定圆心为(35,25),半径大小为20。其他参数含义,和画矩形时一样。

画线的话,我们只需要指定起点和终点即可。

import cv2image = cv2.imread('demo1.jpg')
output = image.copy()
cv2.line(output, (35,25),(125,69),(255,0,0),5)
cv2.imshow('Line', output)
cv2.waitKey()

第5行,我们指定起点为(35,25),终点为(125,69)

结果如下:

我们可能经常需要在图像上添加文字,比如在进行人脸识别的时候,需要在人的脸上绘制出他们的名字。可以使用OpenCV的cv2.putText()函数在图像上添加文字。

import cv2image = cv2.imread('demo.jpg')
output = image.copy()
cv2.putText(output, 'Sasaki Nozomi', (10, 25), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2)
cv2.imshow('Text', output)
cv2.waitKey()

第5~6行,设置的参数如下:

  • img:想要绘制图像的那幅图像,这里是output
  • text:要绘制的文字内容,这里是Sasaki Nozomi
  • pt:绘制的位置,这里是(10,25)
  • font:字体类型,这里是cv2.FONT_HERSHEY_SIMPLEX
  • scale:字体大小乘数,这里是0.7
  • color:字体颜色,这里是红色(0,0,255)
  • thickness:字体粗细,这里是2

如下图所示,“Sasaki Nozomi”绘制在图像上,

参考

[1] https://opencv-python-tutroals.readthedocs.io/en/latest/

[2] https://www.pyimagesearch.com/2018/07/19/opencv-tutorial-a-guide-to-learn-opencv/

OpenCV简明教程相关推荐

  1. OpenCV Python教程(2、图像元素的访问、通道分离与合并)

    OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...

  2. 【OpenCV入门教程之十一】 形态学图像处理(二):开运算、闭运算、形态学梯度、顶帽、黑帽合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接: http://blog.csdn.net/poem_qianmo/article/details/23184547 作者:毛星云(浅墨) ...

  3. cmakelist官方教程_CMakeLists编辑简明教程

    备注:明确说明简明教程,背景就是新建一个工程文件夹且称之为test里面include文件夹放所有头文件,src放所有源文件,CMakeLists.txt直接放在test文件夹下,不引入任何其他库,例如 ...

  4. 一个包含简明教程的网站:cheat-sheets.org

    你听过Cheat-Sheets.org吗?在这里可以看到各种简明教程,包含了大部分的编程语言,C++.C#.Jave.Python.sql.html.css.matlab.qt.mfc.shell.R ...

  5. CGIC简明教程(转摘)

    CGIC简明教程 本系列的目的是演示如何使用C语言的CGI库"CGIC"完成Web开发的各种要求. *********************************     基础 ...

  6. 小白也能看懂的Matplotlib简明教程

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 Matplotlib简介 信息可视化是数据分析中一个重要的部分.它 ...

  7. 【C++简明教程】Python和C++指定元素排序比较

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自|机器学习初学者 Python 中的排序 在 Python ...

  8. kangle web server源代码安装简明教程

    kangle web server源代码安装简明教程 - kangle使用交流 - kangle软件 是一款高性能web服务器,反向代理服务器,提供虚拟主机管理系统及代理服务器,web服务器架设 - ...

  9. CentOs6.5中安装和配置vsftp简明教程

    这篇文章主要介绍了CentOs6.5中安装和配置vsftp简明教程,需要的朋友可以参考下 一.vsftp安装篇 复制代码代码如下: # 安装vsftpd yum -y install vsftpd # ...

最新文章

  1. 安装指定版本Angular-CLI
  2. 区块链论文9 FlyClient-加密货币的超轻客户端
  3. 公司--As Imp的写法
  4. 浅析开源数据库MySQL架构
  5. (0002) iOS 开发之开发者iOS 10 正式版体验报告
  6. Python 字符串操作方法大全
  7. “Paper + Code”才是研读论文的正确姿势 | PaperDaily #02
  8. Vue项目开发目录结构和引用调用关系
  9. 转换字符串为json对象的方法
  10. cassandra使用心得_避免在Cassandra中使用清单
  11. php编译称opcode文件,PHP源码保护和性能加速
  12. AJPFX分析int 和integer的区别
  13. python3读写excel文件_Python3读写 EXCEL文档
  14. wps一直显示正在备份怎么办_做了一天的文档被误删?WPS这个功能随时准备帮你兜底...
  15. few-shot learning, zero-shot learning, one-shot learning,any-shot learning, C-way K-shot,Meta-learn
  16. Java:项目启动报错java: -source 1.5 中不支持 diamond 运算符 (请使用 -source 7 或更高版本以启用 diamond 运算符)
  17. FFT蝶形算法的verilog实现专题——64点FFT 蝶形算法完整展开
  18. c语言贪吃蛇答辩项目,贪吃蛇项目V1答辩.PDF
  19. 根据单头价格清单(核价单),更新单身出货明细的单价
  20. 等保2.0三级云计算扩展要求

热门文章

  1. pdf转ppt乱码怎么办?分享精准PDF转换成PPT转换正确方法
  2. 安装SQL 2016 ,都到最后了出现R server安装失败咋解决
  3. win7安装.net framework4.7.2
  4. fme创建自定义转换器
  5. Sql-server2019无域AlwaysOn集群
  6. matlab优化工具箱介绍
  7. OkHttp基本使用教程
  8. 活动回顾丨欧米区块链——数字资产服务商沙龙
  9. 【python爬虫】用python爬取股票数据
  10. Java实战:Robot脚本自动写博客