第一节 OpenCV 入门
[声明:本文根据官方文档进行通俗易懂的个人总结,随笔和文章都是同步的!]
注:作为本博客的第一篇随笔,小编力求为每一位阅读者以通俗易懂的方式,完全掌握数字图像处理的基础,记得关注哦!
各位小可爱们,从这篇随笔开始,让我们踏上0基础学习OpenCV进行图像处理的奇妙之旅。
前言
OpenCV是一个开源的计算机视觉库, 在Python中都有非常完备的内部公开的计算机视觉接口。 对于刚入门的新人来说,使用这些接口比重复造轮子方便多了。这些接口可以让我们更加方便、不用理解内部原理,就能实现各种功能的图像处理技术,OpenCV正是基于为计算机视觉提供通用接口这一目标而被策划的。
1. 入门
1.1 环境配置
安装 python3.x 以上的版本,opencv 版本在 4.x 以上(opencv3.x 和 opencv4.x 版本内容不兼容)
这里提供 opencv 的安装方式:
pip install opencv-python -i https://pypi.douban.com/simple
为了提高下载速度,使用国内的镜像源,这里提供几个国内的镜像源,方便大家下载:
豆瓣:https://pypi.douban.com/simple
阿里云::https://mirrors.aliyun.com/pypi/simple
清华大学:https://pypi.tuna.tsinghua.edu.cn/simple
中国科技大学:https://pypi.mirrors.ustc.edu.cn/simple
在这里,本人安装的版本是 4.4.0.46
为了后期的需要,同样需要安装 numpy 模块,这个模块大家不知道也没有关系,后期一步一步接触就自然明白。
NumPy 是高性能科学计算和数据分析的基础包;它是 pandas 等其他工具的基础。
numpy 的安装方式:
pip install numpy -i https://pypi.douban.com/simple
本人安装的版本是 1.19.4
1.2 图像处理的基础操作
OK! 到这里呢,就是正式开始我们的 OpenCV 的学习了。
在图像处理的开始呢,我们当然要先知道怎么样去读取一个图片
1.2.1 读取图像
OpenCV 提供了函数 cv2.imread() 来读取图像,该函数呢,支持各种的静态图像格式。
格式:
retval = cv2.imread( filename [, flags])
在这里,把每个参数解释一下:
- retval:返回值,这个值是读取到的图像,如果未读取到,返回 “None”;
- filename:读取图像的完整路径名;
- flags:读取标记,用来控制读取图像后返回的文件类型。
值 | 含义 | 数值 |
cv2.IMREAD_UNCHANGED | 保持原格式不变 | -1 |
cv2.IMREAD_GRAYSCALE | 将图像调整为单通道的灰度图像 | 0 |
cv2.IMREAD_COLOR | 将图像调整为3通道的BGR图像。该值是默认值 | 1 |
cv2.IMREAD_ANYDEPTH | 当载入的图像深度为16位或者32位时,就返回其对应的深度图像;否则,将其转换为8位图像 | 2 |
cv2.IMREAD_ANYCOLOR | 以任何可能的颜色格式读取图像 | 4 |
函数 cv2.imread() 能够读取多种不同类型的图片,具体如下:
Windows位图 | *.bmp、*.dib |
JPEG文件 | *.jpeg、* jpg、 * jpe |
JPEG 2000文件 | *.jp2 |
便携式网络图形(Portable Network Graphis, PNG)文件 | .png |
WebP文件 | * .webp |
便携式图像格式(Portable Image Format) | *.pbm、*.pgm、 *ppm、 *.pxm、 *.pm |
Sun (Sun rasters)格式 | *.sr、*.ras |
TIFF文件 | *.tiff、 *.tif |
OpenEXR图像文件 | * .exr |
Radiance格式高动态范围 (Hig-Dyamic Range, HDR)成像图像 | *.hdr、*.pic |
GDAL支持的栅格和矢量地理空间数据 | Raster、Vector 两大类 |
例如:我们读取名为 img.bmp 的图像,并保持原有格式读入,则使用的语句为:
lena = cv2.imread("img.bmp",-1)
注:上述的代码运行之前,首先需要导入 cv2 模块,为了方便理解,我们在这里函数的前缀都使用 "cv2." 表示:
import cv2 lena = cv2.imread("img.bmp",-1)
1.2.2 显示图像
OpenCV 提供了多个与显示有关的函数,下面对常用的几个进行简单介绍。
1. namedWindow 函数
函数 cv2.namedWindow() 用来创建指定名称的窗口,其语法格式为:
None = cv2.namedWindow(winname)
式中,winname 是要创建的窗口的名称。
例如, 下列语句会创建一个 名为 lesson 的窗口:
cv2.namedWindow("lesson")
2. imshow函数
函数 cv2. imshow() 用来显示图像,其语法格式为:
None = cv2.imshow(winname, mat)
式中:
- winname 是窗口名称。
- mat是要显示的图像。
例:完整代码:
import cv2 lena=cv2.imread("lena .bmp") cv2.namedWindow("lesson") cv2.imshow("lesson", lena)
注:为了方便,文章中的图像由读者自行在电脑上进行操作,这里不再演示,望理解!(只是改变代码中的文件名即可)
3. waitKey 函数
函数 cv2.waitKey() 用来等待按键,当用户按下键盘后,该语句会被执行,并获取返回值.其语法格式为:
retval = cv2.waitKey( [delay] )
- retval:表示返回值。如果没有按键被按下,则返回-1;如果有按键被按下,则返回该按键的ASCII码。
- delay:表示等待键盘触发的时间,单位是ms,当该值是负数或者零时,表示无限等待。该值默认为0。
在实际使用中,可以通过函数 cv2.waitKey() 获取按下的按键,并针对不同的键做出不同的反应,从而实现交互功能。
例如, 如果按下A键,则打开名为“PressA”的窗口,如果按下B键,则打开名为“PressB”的窗口。
import cv2 lena=cv2.imread("lena.bmp") cv2.imshow("demo", lena) key=cv2.waitKey() if key == ord('A') : cv2.imshow ("PressA", lena) elif key == ord('B'): cv2.imshow ("PressB", lena)
Python提供了函数 ord(),用来获取字符的ASCII码值。
因此,在判断是否按下了某个特定的按键时,可以先使用 ord() 函数获取该特定字符的 ASCII 码值,再将该值与 cv2.waitKey() 函数的返回值进行比较,从而确定是否按下了某个特定的键。这样,在程序设计中就不需要 ASCII 值的直接参与了,从而避免了使用 ASCII 进行比较可能带来的不便。
4. destroyWindow 函数
函数 cv2.destroyWindow() 用来释放(销毁)指定窗口,其语法格式为:
None = cv2.destroyWindow(winname)
其中,winname 是窗口的名称。
在实际使用中,该函数通常与函数 cv2.waitKey() 组合实现窗口的释放。
import cv2 lena = cv2.imread("lena.bmp") cv2.imshow("demo", lena) cv2.waitKey() cv2.destroywWindow ("demo")
运行上述程序,首先会在一个 名为 demo 的窗口内显示 lena.bmp 图像。
在程序运行的过程中,当未按下键盘上的按键时,程序没有新的状态出现:当按下键盘上的任意一个按键后,窗口 demo 会被释放。
5. destroyAIlWindows函数
函数 cv2.destroyAlIWindows() 用来释放(销毁)所有窗口,其语法格式为:
None = cv2.destroyAllWindows( )
例:编写一个程序,演示如何使用函数 cv2.destroyAllWindows() 释放所有窗口。根据题目要求,编写代码如下:
import cv2 lena = cv2.imread("lena.bmp") cv2.imshow("demo1", lena) cv2.imshow("demo2", lena) cv2.waitKey() cv2.destroyAllWindows()
运行上述程序,会分别出现名称为 demol 和 demo2 的窗口,在两个窗口中显示的都是 lena.bmp 图像。
在未按下键盘上的按键时,程序没有新的状态出现,当按下键盘上的任意一个按键后,两个窗口都会被释放。
1.2.3 保存图像
OpenCV提供了函数 cv2.imwrite() ,用来保存图像,该函数的语法格式为:
retval = cv2.imwrite(filename, img [, params])
- retval:返回值。如果保存成功,则返回逻辑值真(True);如果保存不成功,则返回逻辑值假(False)。
- filename:要保存的目标文件的完整路径名,包含文件扩展名。
- img:被保存图像的名称。
- params:保存类型参数,是可选的。
例:编写一个程序,将读取的图像保存到当前目录下。
import cv2 lena = cv2.imread ("lena.bmp") r = cv2.imwrite("result.bmp", lena)
注:在这里不要将 filename 和 img 名称弄反了,小编在这里也会经常出错误哦!
好啦好啦!本次随笔已经更新结束喽!
一大早起来同步了一下随笔,连早饭都没吃,要去吃饭喽,拜拜,各位小可爱们!
作者:坚果不爱吃松鼠
本文版权归作者和博客园共有,转载须表明出处,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。
如果觉得还有帮助的话,可以点一下右下角的【推荐】。
本文链接:https://www.cnblogs.com/GLblogs/p/14642994.html