计算机视觉学习笔记(五)---opencv的基本使用(常用函数介绍)

文章目录

  • 前言
  • 一、opencv 安装
  • 二、常见基本操作
    • 1.图片读取
    • 2.颜色转换
    • 3.图像展示
    • 4.图片保存
    • 5.视频数据读取
    • 6.提取与合并颜色通道
        • 6.1 提取颜色通道
        • 6.2 合并颜色通道
    • 7.边界填充(pading)
    • 8. 图像大小调整
    • 9.图像融合
    • 10.图像阈值处理
    • 11.图像平滑处理
        • 11.1 均值滤波 :简单的平均卷积操作
        • 11.2 方框滤波 :基本和均值滤波一样,可以选择归一化 不归一化很容易越界 全亮 不好用
        • 11.3 高斯滤波 : 谁重要(距离当前像素点近) 谁的权重就大
        • 11.4 中值滤波 : 即排序找到中位数 然后用中位数作为滤波结果 去除雪花点噪音的效果最好
  • 总结


前言

要想实现对图片/视频的处理和操作,opencv是必须要掌握的重要工具包,本文从最基础的函数开始,介绍在opencv中常用的图像基本操作,后续将更新一些基于opencv的小项目。


一、opencv 安装

pip install opencv-contrib-python

导入工具包即可,在python里面opencv名字为cv2

import cv2 
import numpy as np

二、常见基本操作

1.图片读取

使用cv2.imread(),将图片路径写入即可,返回结果为numpy.ndarray格式,每个像素点的值在0到255之间,其shape分别表示(高,宽,通道),需要注意的是,正常图像为RGB通道,但是opencv读入的图片为BGR通道

img=cv2.imread("data/cat.jpg")
img.shape
# (414, 500, 3)

其实可选参数介绍

- cv2.IMREAD_COLOR 以彩图读取 默认即该模式
- cv2.IMREAD_GRAYSCALE 以灰度图读取

使用方法,彩色图有三个通道,但是灰度图为单一通道

img2=cv2.imread("data/cat.jpg",cv2.IMREAD_COLOR)
img3=cv2.imread("data/cat.jpg",cv2.IMREAD_GRAYSCALE)
print(img2.shape,img3.shape)
#(414, 500, 3) (414, 500)

2.颜色转换

cv2.cvtColor(参数1,参数2)
参数1:即待转换图片
参数2:转换模式,opencv提供了大量模式根据需求选择即可,此处以BRG彩色图转灰度图为例

img=cv2.imread("data/cat.jpg")
img_gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print(img.shape,img_gray.shape)
# (414, 500, 3) (414, 500)

3.图像展示

cv2.imshow(参数1,参数2)
- 参数1:窗口名称
- 参数2:待展示图片
cv2.waitKey(参数1)
-参数1:等待时间,单位为ms,0则表示任意键终止
cv2.destroyAllWindows()
- 关闭所有窗口

需要注意的是以上三个函数一般配合使用,因此可以写成一个函数以简化代码。

cv2.imshow("The cat",img)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下
计算机视觉学习笔记(五)---opencv的基本使用(常用函数介绍)_第1张图片

4.图片保存

cv2.imwrite(参数1,参数2)
- 参数1:保存的路径
- 参数2:待保存图片

使用示例

cv2.imwrite("save/test.png",img3)

5.视频数据读取

cv2.VideoCapture(参数1)
- 参数1:可以直接写入路径读取本地视频,也可以写数字(0表示本机摄像头,1表示usb外接摄像头)
vc=cv2.VideoCapture("video.mp4")#读入视频

opencv处理视频的本质还是处理视频的每一帧图像,使用read()可以获取一帧

ret,frame=vc.read()
- ret:标志位,表示该帧是否成功读取
- frame:当前帧图像,当ret为False时,frame为None

由于read()执行一次仅能获取一帧图片,因此一般写入while True循环获取每一帧,当ret为False时break即可。

while True:
    ret,frame=vc.read()
    if ret == False:
        break
    cv2.imshow("frame",frame)
    cv2.waitKey(1)
vc.release() # 将视频资源释放
cv2.destroyAllWindows() #关闭所有窗口

6.提取与合并颜色通道

  • 再次强调 cv读取的顺序是BGR

6.1 提取颜色通道

img=cv2.imread("data/cat.jpg")
b,g,r=cv2.split(img)

6.2 合并颜色通道

merge=cv2.merge((b,g,r))

7.边界填充(pading)

cv2.copyMakeBorder(zxx_img,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)

cv2.copyMakeBorder(参数1,参数2,参数3,参数4,参数5,参数6)
-参数1: 待填充图片
-参数2:上部填充大小
-参数3:下部填充大小
-参数4:左侧填充大小
-参数5:右侧填充大小
-参数6:填充类型其介绍如下
 --BORDER_REPLICATE:复制法,也就是复制最边缘像素。
 --BORDER_REFLECT:反射法,对感兴趣的图像中的像素在两边进行复制例如:fedcba|abcdefgh|hgfedcb
 --BORDER_REFLECT_101:反射法,也就是以最边缘像素为轴,对称,gfedcb|abcdefgh|gfedcba
 --BORDER_WRAP:外包装法abcdefgh|abcdefgh|abcdefgh
 --BORDER_CONSTANT:常量法,常数值填充。

使用示例及结果

#指定上下左右填充大小
top,bottom,left,right=60,60,60,60
BORDER_REPLICATE=cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
BORDER_REFLECT=cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
BORDER_REFLECT_101=cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_REFLECT_101)
BORDER_WRAP=cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
BORDER_CONSTANT=cv2.copyMakeBorder(img,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=0)
# 绘图
cv2.imshow("orign",img)
cv2.imshow("BORDER_REPLICATE",BORDER_REPLICATE)
cv2.imshow("BORDER_REFLECT",BORDER_REFLECT)
cv2.imshow("BORDER_REFLECT_101",BORDER_REFLECT_101)
cv2.imshow("BORDER_WRAP",BORDER_WRAP)
cv2.imshow("BORDER_CONSTANT",BORDER_CONSTANT)
cv2.waitKey(0)
cv2.destroyAllWindows()
计算机视觉学习笔记(五)---opencv的基本使用(常用函数介绍)_第2张图片 计算机视觉学习笔记(五)---opencv的基本使用(常用函数介绍)_第3张图片 计算机视觉学习笔记(五)---opencv的基本使用(常用函数介绍)_第4张图片

8. 图像大小调整

dst=cv2.resize(src,size)
- dst:调整后的图片
- src:需要调整的图片
- size:调整后的大小,元组类型例如(120,90)
按比例调整用法示例,下面代码表示,横轴变为原来4倍,纵轴变为2倍,使用该方法时要把size设为0
dst=cv2.resize(src,(0,0),fx=4,fy=2)

9.图像融合

  • 待融合图像需要大小一致
cv2.addWeighted(img1,weight1,img2,weight2,const)
-img1:图片1
-weight1:图片1的权重
-img2:图片2
-weight2:图片2的权重
-const:常数
以下行代码为例,其返回值img_cat_dog=img_cat*0.4+img_dog*0.6+0
img_cat_dog=cv2.addWeighted(img_cat,0.4,img_dog,0.6,0)

10.图像阈值处理

一般使用其完成二值图转换

ret, dst = cv2.threshold(src, thresh, maxval, type)
- ret: 输入的thresh值。
- src: 输入图,只能输入单通道图像,通常来说为灰度图
- dst: 输出图
- thresh: 阈值
- maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定)时所赋予的值
- type:二值化操作的类型,包含以下5种类型: 
	-- cv2.THRESH_BINARY           超过阈值部分取maxval,否则取0
	-- cv2.THRESH_BINARY_INV    THRESH_BINARY的反转
	-- cv2.THRESH_TRUNC            大于阈值部分设为阈值,否则不变
	-- cv2.THRESH_TOZERO          大于阈值部分不改变,否则设为0
	-- cv2.THRESH_TOZERO_INV  THRESH_TOZERO的反转

11.图像平滑处理

  • 其实就是各种滤波 去除噪音

11.1 均值滤波 :简单的平均卷积操作

可以理解为将待处理像素点周围n*m个像素点相加后取平均,将其作为当前像素点滤波结果
n和m是卷积核大小,kernel_size=(n,m)

blur=cv2.blur(img,(3,3))#输入卷积核大小 一般是奇数

11.2 方框滤波 :基本和均值滤波一样,可以选择归一化 不归一化很容易越界 全亮 不好用

box=cv2.boxFilter(img,-1,(5,5),normalize=True)#-1指的是自动计算,保持颜色通道一致
# (5,5) 还是卷积核大小

11.3 高斯滤波 : 谁重要(距离当前像素点近) 谁的权重就大

GaussianBlur=cv2.GaussianBlur(img,(5,5),20,1)#后俩参数为均值和标准差大小

11.4 中值滤波 : 即排序找到中位数 然后用中位数作为滤波结果 去除雪花点噪音的效果最好

medianBlur=cv2.medianBlur(img,3)#选择每多少个点进行一次中位数计算

原始图像
计算机视觉学习笔记(五)---opencv的基本使用(常用函数介绍)_第5张图片
三种滤波结果对比(均值 高斯 中值)


总结

最近由于一直在学习新内容,而且本人加入羊群刚恢复不久,不知不觉已经好久没更新了,本文介绍了opencv一些基本处理,在下一篇文章中将继续介绍opencv的形态学处理

你可能感兴趣的:(计算机视觉学习,opencv,计算机视觉,python)