目录
- OpenCV入门
- 简介
- 入门操作
- 图片
- 视频
- 绘图
- 线段
- 矩形
- 圆形
- 多边形
- 椭圆
- 填充多边形
- 在图像中显示文本字符串
- 目标检测标注示例
- 图像的基本操作
- 获取图像的属性
- 图像ROI
- 拆分及合并图像通道
- 图像扩边(填充)
- 图像加法、减法
- 图像混合
- 位操作
- 颜色空间转换
- 几何变换
- 基础操作
- 图像阈值
- 简单阈值
- 自适应阈值
- 两者对比
- 其余可选参数
- 图像平滑
- 卷积介绍
- 均值滤波
- 方框滤波
- 高斯滤波
- 中值滤波
- 双边滤波
- 形态学转换
- 腐蚀
- 膨胀
- 开/闭运算
- 形态学梯度
- PIL入门
- 简介
- Image类
- 读取图片
- 读取图片并查看其属性
- 格式转换并保存图像
- 创建缩略图
- 裁剪、粘贴、与合并图片
- 裁剪
- 粘贴
- 分离和合并通道
- 颜色变换
- 几何变换
- 调整大小和旋转
- transpose()旋转图像
- transpose()翻转图像
- 读取动态图像
- 其他类
- 图像增强ImageFilter类
- Filters 过滤器
- 像素点处理
- 处理单独通道
- 高级图片增强ImageEnhance类
- 绘制图形和文本ImageDraw类
OpenCV入门
简介
OpenCV(Open Source Computer Vision)是一个开源的计算机视觉库,它提供了很多函数,可以非常高效地实现计算机视觉算法。
应用领域
- 人机交互
- 物体识别
- 图像分割
- 人脸识别
- 动作识别
- 机器人
- 汽车安全驾驶
安装OpenCV
pip install opencv-python
调用OpenCV
import cv2
入门操作
图片
- 加载图片
cv2.imread(filename[, flags])
- 显示图片
cv2.imshow(winname, mat)
- 保存图片
cv2.imwrite(filename,img[, params])
视频
- 读取本地视频文件,显示视频
cv2.VideoCapture(filename/device)
- 用摄像头录制
cv2.VideoCapture(filename/device)
- 保存视频文件
cv2.VideoWriter([filename,fourcc,fps,framesize[,isColor]])
绘图
线段
cv2.Line(img,pt1,pt2,color[,thickness[,lineType[,shift]]])
- img:图像。
- pt1:线段的第一个端点。
- pt2:线段的第二个端点。
- color:线段的颜色。
- thickness:线段的粗细程度。
- line_type:线段的类型如下
1、8 (or 0) - 8-connected line(8邻接)连接线;
2、4 - 4-connected line(4邻接)连接线;
3、CV_AA - antialiased 线条。 - shift:坐标点的小数点位数。
矩形
cv2.rectangle(img,pt1,pt2,color[,thickness[,lineType[,shift]]])
圆形
cv2.circle(img,center,radius,color[,thickness[,lineType[,shift]]])
多边形
cv2.polyLines(img,pts,isClosed,color[,thickness[,linrType[,shift]]])
椭圆
cv2.ellipse(img,center,axes,angle,startAngle,endAngle,color[,thickness[,lineType[,shift]]])
一个参数是中心点的位置坐标。下一个参数是长轴和短轴的长度。椭圆沿逆时针方向旋转的角度。椭圆弧演顺时针方向起始的角度和结束角度,如果是 0 很 360,就是整个椭圆。
填充多边形
cv2.fillConvexPoly(img,points,color[,lineType[,shift]])
-
cv2.fillPoly(img,pts,color[,lineType[,shift[,offset]]])
(一次填充多个)
在图像中显示文本字符串
cv2.putText(img,text,org,fontFace,fontScale,color[,thickness[,lineType[,bottomLeftOrigin]]])
- img:输入图像
- text:要显示的字符串
- org:第一个字符左下角的坐标
- fontFace:字体类型
- fontScale:字体大小
目标检测标注示例
注意:所有的绘图函数的返回值都是 None,所以不能使用img =cv2.line(img,(0,0),(511,511),(255,0,0),5)
等形式。
图像的基本操作
获取图像的属性
图像ROI
选择dog部分并拷贝到其他区域
拆分及合并图像通道
cv2.split(m[,mv])
cv2.merge(mv[,dst])
当调用 imshow(R时,是把图像的R,G,B三个通道的值都变为R的值,所以图像的颜色三通道值为(R,R,R),而 当三个通道d值相同时,则为灰度图。
图像扩边(填充)
cv2.copyMakeBorder(src,top,bottom,left,right,borderType[,dst[,value]])
图像加法、减法
cv2.add(src1,src2[,dst[,mask[,dtype]]])
cv2.subtract(src1,src2[,dst[,mask[,dtype]]])
OpenCV 的加法是一种饱和操作:
250+10 = 260 => 255
图像混合
cv2.addWeighted(src1,alpha,sec2,beta,gamma[,dst[,dtype]])
注意:两张图的大小和通道数须相同
位操作
# 与
cv2.bitwise_and(src1,src2[,dst[,mask]])
# 非
cv2.bitwise_not(src[,dst[,mask]])
# 或
cv2.bitwise_or(src1,src2[,dst[,mask]])
# 异或
cv2.bitwise_xor(src1,src2[,dst[,mask]])
颜色空间转换
有超过150 种转换,经常用到的两种:BGR↔Gray 和 BGR↔HSV。
HSV即Hue(色调),Saturation(饱和度)和Value(亮度)三个channel,RGB是为了让机器更好的显示图像,HSV更贴近人的认知,相比BGR更易区分颜色。
cv2.cvtColor(src,code[,dst[,dstcn]])
cv2.inRange(src,lowerb,upperb[,dst])
几何变换
- 实现缩放、旋转图片
cv2.resize(src,dsize[,dst[,fx[,fy[,interpolation]]]])
cv2.getRotationMatrix2D(center,angle,scale)
cv2.warpAffine(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]]])
- 仿射变换
从一种二维坐标(x,y)到另一种二维坐标(u,v)的线性变换
cv2.getAffineTransform(src,dst)
cv2.warpAffine(src,M,dsize[,dst[,flags[,borderMode[,borderValue]]]])
基础操作
图像阈值
简单阈值
cv2.threshold(src,thresh,maxvalue,type[,dst])
自适应阈值
cv2.adaptiveThreshold(src,maxvalue,adaptiveMethod,thresholdType,blockSize,[,dst])
两者对比
其余可选参数
图像平滑
卷积介绍
使用padding,不改变图片尺寸
cv2.filter2D(src,ddepth,kernel[,dst[,anchor[,delta[,borderType]]]])
卷积核
均值滤波
cv2.blur(src,ksize,[,dst[,anchor[,borderType]]])
3x3卷积核
方框滤波
cv2.boxFilter(src,ddepth,ksize[,dst[,anchor[,normalize[,borderType]]]])
3x3卷积核
当可选参数normalize为True的时候,方框滤波就是均值滤波,上式中的a就等于1/9;normalize为False的时候,a=1,相当于求区域内的像素和。
高斯滤波
高斯滤波常被称为最有用的滤波器,高斯滤波的卷积核权重:中间像素点权重最高,越远离中心的像素权重越小。
默认的3x3高斯卷积核
cv2.GuassianBlur(src,ksize,sigmaX[,dst[,sigmaY[,borderType]]])
sigmax值越大,模糊效果越明显
对比均值滤波和高斯滤波
高斯滤波相比均值滤波效率慢,但可以有效消除高斯噪声,能保留更多的图像细节
中值滤波
中值又叫中位数,是所有数排序后取中间的值。孤立的点容易被消除,适用于去除椒盐噪声和斑点噪声。
cv2.medianBlur(src,ksize[,dst])
对比均值滤波和中值滤波
对于斑点噪声图,中值滤波处理的更好
双边滤波
cv2.bilateralFilter(src,d,sigmaColor,sigmaSpace[,dst[,borderType]])
对比高斯滤波和双边滤波
双边滤波明显保留了更多边缘信息
形态学转换
腐蚀
腐蚀的效果是把图片“变瘦”
cv2.erode(src,kernel[,dst[,anchor[,iterations[,borderType[,borderType]]]]])
膨胀
膨胀与腐蚀相反,取局部最大值,效果是把图片“变胖”
cv2.dilate(src,kernel[,dst[,anchor[,iterations[,borderType[,borderType]]]]])
开/闭运算
- 开运算:先腐蚀后膨胀。作用是分离物体,消除小区域。
- 闭运算:先膨胀后腐蚀。作用是消除(闭合)物体里面的小黑洞。
形态学梯度
膨胀图减去腐蚀图,可得到物体的轮廓。
PIL入门
简介
PIL(Python Image Library)是python的第三方图像处理库,PIL原本只支持python2.x的版本,后移植到python3的pillow库。
安装PIL
pip install pillow
调用PIL
from PIL import Image
Image类
读取图片
读取图片并查看其属性
- format:图像格式
- size:图像的 (宽,高) 元组
- mode:RGBA 带透明度的真彩图像
- show():使用系统默认图片查看器显示图像
格式转换并保存图像
创建缩略图
裁剪、粘贴、与合并图片
裁剪
原图size(352,244),box指的是(left, upper, right, lower)
粘贴
分离和合并通道
颜色变换
Image.convert()
色彩模式转换为L模式,计算公式如下
L = R * 299/1000 + G * 587/1000 + B * 114/1000
几何变换
调整大小和旋转
transpose()旋转图像
transpose()翻转图像
读取动态图像
打开动态图像时,PIL 会自动加载序列中的第一帧,使用 seek 和 tell 方法在不同的帧之间移动。
其他类
图像增强ImageFilter类
Filters 过滤器
对比均值滤波和中值滤波
像素点处理
示例:每个像素点扩大1.8倍
处理单独通道
高级图片增强ImageEnhance类
- ImageEnhance.Color(im):色彩饱和度
- ImageEnhance.Brightness(im):亮度
- ImageEnhance.Sharpness(im):清晰度
- ImageEnhance.Contrast(im):对比度
增加50%对比度示例
其他图像增强功能可以使用 ImageEnhance 模块中的类。从图像创建后,可以使用 ImageEnhance 快速调整图片的对比度、亮度、饱和度和清晰度。
绘制图形和文本ImageDraw类
ImageDraw类支持各种几何图形的绘制和文本的绘制,如直线、椭圆、弧、弦、多边形以及文字等。