来源 | 极链AI云(性价比最高的共享GPU算力平台,新人注册可领取限定198元大礼包,价值100+小时的免费使用时长,领取地址:https://cloud.videojj.com/

作者 | sun 极链AI云技术原创奖励计划

原文地址 | openCV基本操作笔记(官网论坛)

 

读取图片

cv2.imread(filepath,flags)
  • filepath:要读入图片的完整路径
  • flags:读入图片的标志
    • cv2.IMREAD_COLOR:默认参数,读入一副BGR彩色图片,忽略alpha通道
    • cv2.IMREAD_GRAYSCALE:读入灰度图片
    • cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道
  • 返回值:一个rows * cols * depth的数组,rows是图像像素的行数 cols是图像像素的列数 depth是图像颜色深度,灰度图一般是1 ,RGB图一般是3

显示图片

cv2.imshow('image',img)
  • image:显示图像的窗口的名字
  • img:要显示的图像(imread读入的图像)

保存图片

cv2.imwrite(file,img,[num])
  • file:要保存的文件名
  • img:保存的图像
  • num:针对特定的格式:对于JPEG,其表示的是图像的质量,用0 - 100的整数表示,默认95;对于png ,第三个参数表示的是压缩级别,默认为3。

颜色空间转换函数

cv2.cvtColor(src, code, dst=None, dstCn=None)
  • src: 原图像;
  • code: 指定颜色空间转换类型,cv2.COLOR_BGR2RGB,cv2.COLOR_BGR2GRAY 等
  • dst: 目标图像;与原图像大小深度一致;
  • dstCn: 指定目标图像通道数;默认None,则会根据src、code自动计算;

图像仿射

cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) → dst
  • src :输入图像;
  • M:变换矩阵,作为仿射变换矩阵,一般反映平移或旋转的关系,为numpy的float32类型的2×3的变换矩阵。
  • dsize:输出图像的大小;
  • flags :插值方法的组合(int 类型);
  • borderMode :边界像素模式(int 类型);
  • borderValue :边界填充值; 默认情况下,它为0。

获得仿射变化矩阵

cv2.getRotationMatrix2D(center, angle, scale) -> Mat
  • center:图片的旋转中心
  • angle:旋转角度
  • scale:缩放比例
  • Mat:仿射变换矩阵,2×3的变换矩阵。

图像缩放

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
  • src:原图像d
  • size:输出图像所需大小
  • fx:沿水平轴的比例因子
  • fy:沿垂直轴的比例因子
  • interpolation:插值方式

画图

画直线、矩形

cv2.line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) → img
cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) → img
  • img:背景图
  • pt1:直线起点坐标
  • pt2:直线终点坐标
  • color,当前绘画的颜色。如在BGR模式下,传递(255,0,0)表示蓝色画笔。灰度图下,只需要传递亮度值即可。
  • thickness,画笔的粗细,线宽。若是-1表示画封闭图像,如填充的圆。默认值是1
  • lineType,线条的类型
    • 如8-connected类型、anti-aliased线条(反锯齿),默认情况下是8-connected样式ide,cv2.LINE_AA表示反锯齿线条,在曲线的时候视觉效果更佳。

画圆形

cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]]) → img
  • img:背景图
  • center:圆心
  • radius:半径
  • color:颜色
  • thickness:线粗细

添加文本

cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]]) → None
  • img:图片
  • text:想要输出到图像上的的文本
  • org:文字的起始坐标(左下角为起点)
  • position:输出位置的坐标
  • Font type:字体,可以用cv2.putText()函数文档查看支持的字体
  • Font Scale,指定字体大小,文字大小(缩放比例)
  • 其他,如颜色,线宽,线型等,推荐使用lineType = cv2.LINE_AA

几何变换

图像翻转

cv2.flip(src, flipCode[, dst]) → dst
  • src: 原始图像矩阵;
  • dst: 变换后的矩阵;
  • flipMode: 翻转模式,有三种模式
    • 0 --- 垂直方向翻转; 1----- 水平方向翻转; -1:水平、垂直方向同时翻转

图像加法

cv2.add(src1, src2, dst=None, mask=one)
  • src1:图像1
  • src2:图像2
  • dst:返回结果
  • mask:指定msk区域进行操作。

图像减法

cv2.substract(src1, src2, dst=None, mask=one)

图像与、或、非、异或运算

cv2.bitwise_and(src1, src2, dst=None, mask=one)
cv2.bitwise_or(src1, src2, dst=None, mask=None)
cv2.bitwise_not(src1, src2, dst=None, mask=None)
cv2.bitwise_xor(src1, src2, dst=None, mask=None)

图像通道拆分

cv2.split(m [,mv]) -> mv
  • m:输入多通道数组。
  • mv:输出数组或数组向量

图像通道合并

 cv2.merge(mv [,dst]) -> dst
  • mv:要合并的矩阵的输入数组或向量;所有的矩阵都mv必须具有相同的大小和深度。
  • dst:具有与相同大小和相同深度的输出数组mv[0];通道数将是矩阵数组中通道的总数。

图像下采样

cv2.pyrDown(src, dst=None, dstsize=None, borderType=None)
  • src:表示输入图像
  • dst:表示输出图像
  • dstsize:表示输出图像的大小
  • borderType:表示图像边界的处理方式

图像上采样

cv2.pyrUp(src, dst=None, dstsize=None, borderType=None)

形态学

构造结构元素(核)

cv2.getStructuringElement(shape, ksize[, anchor]) → retval
  • size:核的形状。可以选择三种
    • 矩形:MORPH_RECT;
    • 交叉形:MORPH_CROSS;
    • 椭圆形:MORPH_ELLIPSE;
  • ksize:核的尺寸
  • anchor:元素内的锚点位置。默认值 (-1,-1)表示锚点位于中心。注意,只有十字形的形状取决于锚位置。在其他情况下,锚点仅调节形态运算结果偏移了多少。

腐蚀

cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst¶
  • 消除噪声,分割(isolate)独立的图像元素,以及连接(join)相邻的元素,寻找图像中的明显的极大值区域或极小值区域。
  • src:输入的图片
  • kernel:结构元素(核)
  • dst:输出与src大小和类型相同的图像
  • iteration:迭代的次数
  • anchor:锚点在元素内的位置;默认值(-1, -1)表示锚点位于元素中心。

膨胀

cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst¶
  • 消除噪声,分割(isolate)独立的图像元素,以及连接(join)相邻的元素,寻找图像中的明显的极大值区域或极小值区域。

高级形态转换

cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) → dst
  • src:输入的图片,
  • op:进行变化的方式
    • cv2.MORPH_OPEN:开运算,先进行腐蚀操作,再进行膨胀操作,消除小白点
    • cv2.MORPH_CLOSE:关运算,先进行膨胀操作,再进行腐蚀操作,消除小黑点
    • cv2.MORPH_GRADIENT:形态学梯度,膨胀图减去腐蚀图,得到图片的轮廓
    • cv2.MORPH_TOPHAT:顶帽,原图减去开运算后的图,原始图片的白点
    • cv2.MORPH_BLACKHAT: 黑帽,闭运算减去原图后的图,原始图片的黑点
  • kernel:结构元素(核)
  • iterations:迭代次数
  • borderType :像素外推方法
  • borderValue :边框不变时的边框值

图像滤波

均值滤波

blur(src, ksize[, dst[, anchor[, borderType]]]) → dst
  • img:原图像
  • ksize:核大小

中值滤波

cv2.medianBlur(src, ksize[, dst]) → dst
  • img:原图像
  • ksize:核大小

高斯滤波

cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) → dst
  • img:原图像
  • ksize:核大小

双边滤波

cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace[, dst[, borderType]]) → dst
  • src:输入图像
  • d:过滤时周围每个像素领域的直径
  • sigmaColor:在color space中过滤sigma。参数越大,临近像素将会在越远的地方mix。
  • sigmaSpace:在coordinate space中过滤sigma。参数越大,那些颜色足够相近的的颜色的影响越大。

颜色空间转换

RGB

​ RGB是从颜色发光的原理来设计定的,通俗点说它的颜色混合方式就好像有红、绿、蓝三盏灯,当它们的光相互叠合的时候,色彩相混,而亮度却等于两者亮度之总和,越混合亮度越高,即加法混合。

HSV

HSV是一种比较直观的颜色模型,所以在许多图像编辑工具中应用比较广泛,这个模型中颜色的参数分别是:色调(H, Hue),饱和度(S,Saturation),明度(V, Value)。
  • 色调H:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

  • 饱和度S:饱和度S表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。

  • 明度V:明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

Lab

​ 一种设备无关的颜色系统,也是一种基于生理特征的颜色系统。这也就意味着,它是用数字化的方法来描述人的视觉感应。

  • L:用于表示像素的亮度,取值范围是[0,100],表示从纯黑到纯白;
  • a:从红色到绿色的范围,取值范围是[127,-128];
  • b:从黄色到蓝色的范围,取值范围是[127,-128]。

Grayscale

​ 灰阶图像就是黑白图像,通过调节灰度值来显示影像

图像二值化

固定阈值二值化

cv2.threshold(src, thresh, maxval, type[, dst]) → retval, dst
  • src:输入图片 (single-channel, 8-bit or 32-bit floating point).

  • thresh:表示的是阈值(起始值)

  • maxval:在二元阈值THRESH_BINARY和逆二元阈值THRESH_BINARY_INV中使用的最大值

  • type:表示的是这里划分的时候使用的是什么类型的算法

    • THRE SH_BINARY

      <img src="openCV基本操作.assets/image-20200409151821364.png" alt="image-20200409151821364" style="zoom:50%;" />

    • THRE SH_BINARY_INV

      <img src="openCV基本操作.assets/image-20200409151849539.png" alt="image-20200409151849539" style="zoom:50%;" />

    • THRE SH_TRUNC

      <img src="openCV基本操作.assets/image-20200409151904889.png" alt="image-20200409151904889" style="zoom:50%;" />

    • THRE SH_TOZERO

      <img src="openCV基本操作.assets/image-20200409151917045.png" alt="image-20200409151917045" style="zoom:50%;" />

    • THRE SH_TOZERO_INV

      <img src="openCV基本操作.assets/image-20200409151937495.png" alt="image-20200409151937495" style="zoom:50%;" />

  • 自动获取阈值(基于直方图的二值化):特殊值THRESH_OTSU可以与以上值之一通过 ‘|’ 组合。在这种情况下,通过Otsu’s算法确定最佳阈值值,并使用它,而不是指定的阈值。目前,Otsu的方法仅适用于8位图像。

自适应阈值二值化

cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) → dst
  • src: 输入图,只能输入单通道8位图像
  • maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
  • thresh_type: 阈值的计算方法,包含以下2种类型:
    • cv2.ADAPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值取自相邻区域的加权和,权重为一个高斯窗口
  • type:二值化操作的类型,与固定阈值函数相同,包含以下5种类型:
    • cv2.THRESH_BINARY;
    • cv2.THRESH_BINARY_INV;
    • cv2.THRESH_TRUNC;
    • cv2.THRESH_TOZERO;
    • cv2.THRESH_TOZERO_INV.
  • Block Size: 邻域大小(用来计算阈值的区域大小)
  • C :阈值计算方法中的常数项,阈值等于平均值或加权平均值减去这个常数

图像梯度

Laplacian

cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst
  • src:输入图像不用解释了;
  • ddepth:图像的深度(数据类型),-1表示采用的是与原图像相同的深度。可以使用cv2.CV_64F等,因为有方向,所以要比原图大
  • ksize:算子的大小,必须为1、3、5、7。默认为1。
  • scale:缩放导数的比例常数,默认情况下没有伸缩系数;
  • delta:是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中;
  • borderType:是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。

Sobel

cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) → dst
  • dx和dy表示的是求导的阶数,0表示这个方向上没有求导,一般为0、1、2

CANNY边缘检测

  1. 噪声去除
  2. 计算图像梯度
  3. 非极大值抑制
  4. 滞后阈值
cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient ]]])
  • image:源图像,必须为单通道的灰度图
  • threshold1:阈值minVal
  • threshold2:阈值maxVal
  • apertureSize:用于计算图片提取的 Sobel kernel 尺寸
  • L2gradient:指定计算梯度的等式

视频操作

摄像头读取

cv2.VideoCapture() → <VideoCapture object>
cv2.VideoCapture(filename) → <VideoCapture object>
cv2.VideoCapture(device) → <VideoCapture object>
  • filename:打开的视频文件(例如video.avi)或图像序列的名称(例如img_%02d.jpg,它将读取img_00.jpg,img_01.jpg,img_02.jpg等示例)
  • device:打开的视频捕获设备的ID(即摄像机索引)。如果连接了单个摄像机,则只需传递0。

读取帧

cv2.VideoCapture.read([image]) → retval, image
  • retval:布尔值,如果读取帧是正确的则返回True,如果文件读取到结尾,它的返回值就为False
  • image:读取到的图像

初始化成功判断

cv2.VideoCapture.isOpened() → retval
  • retval:如果先前对VideoCapture构造函数或cv2.VideoCapture.open调用成功,则返回true。

关闭视频文件或捕获设备

cv2.VideoCapture.release() → None

关闭所有窗口

cv2.destroyAllWindows()

延时等待键盘输入

cv2.waitKey([delay]) → retval
  • delay:等待时间,单位为毫秒,当为0是,代表永远
  • 常用方法:if cv2.waitKey(1) & 0xFF == ord('q'): break

获取摄像头属性

cv2.VideoCapture.get(propId) → retval
  • propId:属性标识符
    • cv2.CAP_PROP_POS_MSEC:视频文件的当前位置,以毫秒为单位或视频捕获时间戳。
    • cv2.CAP_PROP_POS_FRAMES:基于0的下一个要解码/捕获的帧的索引。
    • cv2.CAP_PROP_POS_AVI_RATIO:视频文件的相对位置:0-电影的开始,1-电影的结束。
    • cv2.CAP_PROP_FRAME_WIDTH:视频流中帧的宽度。
    • cv2.CAP_PROP_FRAME_HEIGHT:视频流中帧的高度。
    • cv2.CAP_PROP_FPS:帧频。
    • cv2.CAP_PROP_FOURCC:编解码器的4个字符的代码。
    • cv2.CAP_PROP_FRAME_COUNT:视频文件中的帧数。
    • cv2.CAP_PROP_FORMAT resolve ():返回的Mat对象的格式。
    • cv2.CAP_PROP_MODE:特定于后端的值,指示当前的捕获模式。
    • cv2.CAP_PROP_BRIGHTNESS:图像的亮度(仅适用于相机)。
    • cv2.CAP_PROP_CONTRAST:图像的对比度(仅适用于相机)。
    • cv2.CAP_PROP_SATURATION:图像的饱和度(仅适用于相机)。
    • cv2.CAP_PROP_HUE:图像的色相(仅适用于相机)。
    • cv2.CAP_PROP_GAIN:图像的增益(仅适用于相机)。
    • cv2.CAP_PROP_EXPOSURE:曝光(仅适用于相机)。
    • cv2.CAP_PROP_CONVERT_RGB:布尔型标志,指示是否应将图像转换为RGB。
    • CV_CAP_PROP_WHITE_BALANCE_U:白平衡设置的U值(注意:当前仅由DC1394 v 2.x后端支持)
    • CV_CAP_PROP_WHITE_BALANCE_V:白平衡设置的V值(注意:当前仅受DC1394 v 2.x后端支持)
    • CV_CAP_PROP_RECTIFICATION:立体摄像机的纠正标志(注意:当前仅受DC1394 v 2.x后端支持)
    • CV_CAP_PROP_ISO_SPEED:摄像机的ISO速度(注意:当前仅受DC1394 v 2.x后端支持)
    • CV_CAP_PROP_BUFFERSIZE:存储在内部缓冲存储器中的帧数(注意:当前仅受DC1394 v 2.x后端支持)

设置摄像头属性

cv2.VideoCapture.set(propId, value) → retval

视频写入

cv2.VideoWriter([filename, fourcc, fps, frameSize[, isColor]]) → <VideoWriter object>
  • filename:输出文件名.
  • fourcc:4个部分用来选择视频编码格式。例如:, CV_FOURCC('P','I','M','1') 是MPEG-1 编解码器, CV_FOURCC('M','J','P','G') 是jpeg编解码器等。
  • fps:输出视频的帧率.
  • frameSize:视频帧的大小.
  • isColor:如果不为零,则编码器将期望并编码彩色框架,否则它将与灰度框架一起使用(仅Windows当前支持该标志)

 

想要认识更多深度学习小伙伴,交流更多技术问题,欢迎关注公众号“极链AI云”(为你提供性价比最高的共享算力平台,官网地址:https://cloud.videojj.com/

更多推荐