前言
最近为了做人脸识别的比赛项目,自己学习了一下openCV的简单操作,
发几篇博文把学到的东西总结一下。慢慢码,不定期更新。
openCV简介
OpenCV(open指开源,CV是computer vision 计算机视觉的缩写)是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。
openCV的安装
在cmd中使用 pip install opencv-python 直接安装
入门操作
1.读取、展示图片
openCV对图片处理的大概流程是这样的:
- 使用cv2下的imread函数读入图片;
- 对图片进行处理(灰度转化、模糊、掩膜等);
- 使用imshow函数展示图片
接下来具体介绍一些每个函数及其参数。
cv2.imread(filename, flag=1) 读入图片
参数1:读入图片的路径;
参数2:标志量,如果flag=1,读入的为原图片;flag=0,读入灰度图;默认为1
返回值:返回值为一个矩阵,第一维是矩阵的长,第二维是矩阵的宽,第三维为图片的通道数。(如果flag=1则没有第三维)。
cv2.imshow(windowName, img) 显示图片
参数1:展示图片的窗口的名字;
参数2:需要展示的图片矩阵;
import cv2
# 导入图片
img = cv2.imread("../picture/01.jpg", 1)
print(img.shape) # 查看图片矩阵形状
print(img) # 查看图片矩阵
cv2.imshow("Output", img) # imshow显示图片
# delay单位是毫秒,默认为0,waitkey函数意为窗口在delay秒后自动关闭,delay为0则无限等待
cv2.waitKey(0)
效果:
2.读取视频
openCV中提供了读取视频的方法VideoCapture()
方法本质是将视频拆分成一张张图片,然后送入while循环中逐次读取出来,然后imshow在窗口当中。
cv2.VideoCapture(filename/deviceID)
函数传入的参数为视频的路径或者是摄像头id编号(笔记本摄像头默认编号为0)
import cv2
# 调用摄像头只需更改视频路径为 0, 其他代码无需改动
cap = cv2.VideoCapture("./video/01.mp4")
while True:
# 第一个变量bool类型用来判断,read()函数是否成功执行,将捕获的信息存在img中
success, img = cap.read()
cv2.imshow("video", img)
# 设置每张图片等待一毫秒消失,并且设置键盘输入q则结束视频的读取
if cv2.waitKey(1) & 0xFF == ord('q'):
break
结果:
图片处理
在此板块中,会介绍一些基本的图片处理方法。
1.图片转化为灰度图
转化为灰度图的目的一般情况下是为了减少图片处理的计算量 。自然界中,颜色本身非常容易受到光照的影响,rgb变化很大,反而梯度信息能提供更本质的信息。三通道转为一通道后,运算量大大减少。
cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
参数1:原图片矩阵
参数2:openCV中提供了很多设定好的参数,BGR2GRAY参数意为BGR图片转化到灰度图,其他参数不一一赘述。
返回值:一个二维的灰度图数组。
2.高斯模糊
进行高斯模糊的目的主要是对图像进行去噪声(无用的干扰特征),同时能够更多的保留图像的总体灰度分布特征。
cv2.GaussianBlur(src, ksize, sigmaX, sigmaY)
src: 图片输入路径。
ksize:运算用滑动窗口大小,窗口矩阵必须为奇数(高斯操作原因)。
sigmaX:X方向上的高斯核标准偏差。
sigmaY:Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出。
返回值:一个与src同规格的经模糊后图像。
3.边缘查找
使用cv2中提供的Canny函数进行图片的边缘查找
cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient[[[)
image:输入图像
threshold1:设置的低阈值
threshold2:设置的高阈值,一般高低阈值的比例为3:1或者2:1
(根据图片边缘寻找情况,自行调整高低闸值)
返回值:一个带有边缘显示的图像。
4.腐蚀&膨胀腐蚀:
- 腐蚀会把物体的边界腐蚀掉,卷积核沿着图象滑动,如果卷积核对应的原图的所有像素值为1,那么中心元素就保持原来的值,否则变为零。主要应用在去除白噪声,也可以断开连在一起的物体。
- 膨胀:卷积核所对应的原图像的像素值只要有一个是1,中心像素值就是1。一般在除噪是,先腐蚀再膨胀,因为腐蚀在去除白噪声的时候也会使图像缩小,所以我们之后要进行膨胀。当然也可以用来将两者物体分开。
扩展:
开运算和闭运算
1.开运算和闭运算就是将腐蚀和膨胀按照一定的次序进行处理。 但这两者并不是可逆的,即先开后闭并不能得到原先的图像。
2.为了获取图像中的主要对象:对一副二值图连续使用闭运算和开运算,或者消除图像中的噪声,也可以对图像先用开运算后用闭运算,不过这样也会消除一些破碎的对象。
开运算:先腐蚀后膨胀,用于移除由图像噪音形成的斑点。
闭运算:先膨胀后腐蚀,用来连接被误分为许多小块的对象;
腐蚀操作 cv2.erode(img,kernel)
img: 输入图片路径。
kernel:用来操作的卷积核的大小。
返回值:腐蚀后的图像矩阵
膨胀操作 cv2.dilate(img,kernel)
img: 输入图片路径。
kernel:用来操作的卷积核的大小。
返回值:膨胀后的图像矩阵。
import cv2
import numpy as np
img = cv2.imread("../picture/01.jpg")
# 腐蚀与膨胀的卷积核的定义
kernel = np.ones((5, 5), np.uint8)
# 转化为灰度图
imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# ksize()内核大小,blur模糊图像
imgBlur = cv2.GaussianBlur(imgGray, (7, 7), 0)
# 边缘检测, 第二三参数为闸值1,2
imgCanny = cv2.Canny(img, 150, 200)
# 膨胀,在边缘线模糊的情况下,进行增强
# 第二个参数为内核,第三个为对一幅图像进行迭代膨胀的次数
imgDialation = cv2.dilate(imgCanny, kernel=kernel, iterations=1)
# 腐蚀操作,与膨胀操作相反
imgEroded = cv2.erode(imgDialation, kernel, iterations=1)
cv2.imshow("Gray Image", imgGray)
cv2.imshow("Blur Image", imgBlur)
cv2.imshow("Canny Image", imgCanny)
cv2.imshow("Dialation Image", imgDialation)
cv2.imshow("Eroded Image", imgEroded)
cv2.waitKey(0)
效果图:
灰度图:
高斯模糊后:
边缘检测:
膨胀:
腐蚀:
5.裁剪&更改图片尺寸
更改图片尺寸
在很多时候需要对imread的图片进行大小的修改(神经网络的输入、在同一窗口中展示多张图片),openCV中提供了cv2.resize()函数来对图片的尺寸大小进行修改,本质是改变图片矩阵中像素点的数量。
cv2.resize(src, dsize, fX, fY,interpolation)
src: 输入图片路径。
dsize:输出图片大小,为一个一维两元素的列表/元组,分别指定宽和高。
fX:如果dsize为(0, 0),则fX与fY生效,为X方向上缩放的倍率。
fY:y方向上缩放的倍率。
interpolation:表示插值方式,有以下几种:
- NTER_NEAREST – 最近邻插值
- INTER_LINEAR – 线性插值(默认)
- INTER_AREA – 区域插值
- INTER_CUBIC – 三次样条插值
- INTER_LANCZOS4 -Lanczos插值
返回值:经过大小变换的新图象。
# resize参数 : 路径,输出图片大小(如果设置缩放,输出图片为(0,0), x缩放,y缩放, 插入方式
imgResize = cv2.resize(img, (250, 150))
cv2.imshow("Resize", imgResize)
cv2.waitKey(0)
裁剪图片(通过切割图片矩阵实现)
在计算机中,图像是以矩阵的形式保存的(先行后列)。
比如一张宽度640像素、长度480像素的灰度图保存在一个480 * 640的矩阵中。
openCV中,默认的坐标系是从屏幕的左上方开始,向左为X,向右为Y。
虽然openCV中设置横方向为x坐标,但是在切割图片矩阵的时候是以img[height, weight]的方式进行切割的。
# 裁剪图像, 先写高度,再写宽度
imgCrope = img[0:200, 200:500]
cv2.imshow("Croppe", imgCrope)
cv2.waitKey(0)
本部分完整代码:
import cv2
# 导入图片
img = cv2.imread("../picture/01.jpg")
print(img.shape) # 高、宽、通道数、BGR
# 更改图片大小
# resize参数 : 路径,输出图片大小(如果设置缩放,输出图片为(0,0), x缩放,y缩放, 插入方式
imgResize = cv2.resize(img, (250, 150))
print(imgResize.shape)
# 裁剪图像, 先写高度,再写宽度
imgCrope = img[0:200, 200:500]
print(imgCrope.shape)
cv2.imshow("Output", img)
cv2.imshow("Resize", imgResize)
cv2.imshow("Croppe", imgCrope)
cv2.waitKey(0) # delay单位是毫秒
运行结果:
原图片:
今天的文章opencv python教程简书_opencv轻松入门面向python「建议收藏」分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/66537.html