Python-OpenCV所有函数的参数及参数意义

Python-OpenCV所有函数的参数及参数意义

可以通过 ctrl + f 来寻找所需的函数

#一. 读入图像

#####1. cv2.imread():

  • 第一个参数是该图像的路径,
  • 第二个参数是告诉函数该以何种方式去读取图片;
  • cv2.IMREAD _ COLOR:读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
  • cv2.IMREAD _ GRAYSCALE:以灰度模式读入图像
  • cv2.IMREAD _ UNCHANGED:读入一幅图像,并且包括图像的alpha通道

#二. 显示图像

#####1. cv2.imshow():

  • 第一个参数是窗口的名字
  • 第二个是我们图像
    #####2. cv2.waitKey():
  • 是一个键盘绑定函数,函数等待特定的几毫秒,看是否有键盘输入,如果按下任意键,函数会返回按键的ASCI码值,程序将会继续进行;如果没有键盘输入,返回值为-1,如果我们设置这个函数的参数为0,那么他将会无限等待键盘输入。
    #####3. cv2.destoryAllWindows():
  • 可以删除任何我们建立的窗口
    #####4. cv2.destoryAllWindow():
  • 可以在括号中输入你想删除的窗口名
    #####5. cv2.namedWindow():
  • 决定窗口是否可以调整大小。
  • 第一个参数为窗口名
  • 第二个参数为判断窗口是否可以调整大小,初始设定函数的第二个参数为 cv2.WINDOW_AUTOSIZE,若改为cv2.WINDOW _ NORMAL就可以调整窗口大小了

#三. 保存图像

#####1. cv2.imwrite():

  • 第一个参数为想要保存成的文件名
  • 第二个参数为你要保存的图像变量。

#四.用摄像头捕获视频

#####1. cv2.VideoCapture():

  • 参数为设备的索引号,或者一个视频文件。设备索引号就是在指定要使用的摄像头,电脑的内置摄像头的索引号为0,也可以通过设置成1或者其他的来选择别的摄像头。
  • eg.cap=cv2.VideoCapture(0)
    #####2. cap.release():
  • 停止捕获视频
    #####3. cap.read():
  • 返回一个布尔值,如果帧读取正确就是True,可以通过他的返回值来检查视频文件是否达到结尾。
    #####4. cap.isOpened():
  • 检查是否成功初始化摄像头设备,如果初始化成功,则返回True,否则就要使用函数cap.open()。
    #####5. cap.get(propld):
  • 获得视频的一些参数信息,这里propld可以是0到18的任何整数,每个数代表视频的一个属性。
    1~18每个数代表的属性
    #####6. cap.set(propld,value):
  • 修改视频的属性,value就是你想要设置成的新值

#五. 保存视频

#####1. cv2.VideoWriter_fourcc():
视频解码器
#####2. cv2.flip():实现视频翻转。
翻转相关的参数

#六. 用Opencv绘图

#####1. cv2.line():

  • 划线函数,需要告诉函数这条线的起点和终点;
  • 第一个参数img:要划的线的所在的图像;
  • 第二个参数pt1:直线起点;
  • 第三个参数pt2:直线终点;
  • 第四个参数color:直线的颜色;
  • 第五个参数thickness:线条的粗细
    #####2. numpy.zeros(shape,dtype=float,order=‘C’):
  • 返回给定形状和类型的新数组,用 0 填充;用来创建一个画布。
    zeros参数和例子
    zeros第一个参数为三维列表
    #####3. cv2.rectangle():
  • 画矩形函数,需要告诉函数矩形的左上角顶点和右上角顶点的坐标;
  • 第一个参数img:要划的矩形的所在的图像;
  • 第二个参数pt1:矩形的左上角顶点;
  • 第三个参数pt2:矩形的右上角顶点;
  • 第四个参数color:矩形边框的颜色;
  • 第五个参数thickness:边框线条的粗细,-1是为填充。
    #####4. cv2.circle():
  • 画圆形函数,需要告诉函数圆形的中心坐标和半径的大小;
  • 第一个参数img:要画的圆形的所在的图像;
  • 第二个参数center:圆形的中心坐标点;
  • 第三个参数radius:圆形的半径;
  • 第四个参数color:圆形边框的颜色;
  • 第五个参数thickness:边框线条的粗细,-1是为填充 。
    #####5. cv2.ellipse():
  • 画椭圆的函数,需要告诉函数中心点位置,长轴和短轴的长度,整个椭圆的旋转角度(正数为顺时针旋转,负数为逆时针旋转),绘制椭圆的起始角度和终止角度;
  • 第一个参数img:要画的椭圆所在的图像;
  • 第二个参数center:椭圆的中心坐标点;
  • 第三个参数axes:椭圆的长轴和短轴的长度;
  • 第四个参数angle:整个椭圆的旋转角度;
  • 第五个参数startAngle:绘制椭圆的起始角度;
  • 第六个参数endAngle:绘制椭圆的终止角度;
  • 第七个参数color:线条颜色;
  • 第八个参数thickness:线条粗细
    ellipse参数和例子
    #####6. numpy.array():
  • 创建一个数组矩阵;
  • 前面n个参数为 N 个维度的数组;
  • 最后一个参数为数组的数据类型。
    #####7. reshape():
  • 用于改变数组的形状
    reshape的具体用法
    #####8. cv2.polylines():
  • 画多边形的形状;需要告诉函数每个顶点的坐标。
  • 第一个参数img:要绘制的多边形的图像;
  • 第二个参数list:多边形的顶点的列表;
  • 第三个参数bool:True表示图像闭合,False表示多边形不闭合;
  • 第四个参数color:线条的颜色;
  • 第五个参数thickness:线条粗细
    #####9. cv2.putText():
  • 添加文字函数;
  • 第一个参数img:要添加文字的图像;
  • 第二个参数是str(i):添加的文字;
  • 第三个参数pt:文字左上角的坐标;
  • 第四个参数font:字体;
  • 第五个参数size:字体大小;
  • 第六个参数color:字体的颜色;
  • 第七个参数thickness:字体的粗细;
    可以供选择的字体

#七,把鼠标当画笔

#####1. 可以用下列的代码查看所有被支持的鼠标事件

	import cv2        
	events = [i for i in dir(cv2) if 'EVENT' in i]  
	print(events) 

鼠标事件
#####2. cv2.setMouseCallback():

  • 将窗口与鼠标事件绑定在一起。

  • 第一个参数windowName:窗口名称;

  • 第二个参数MouseCallback:鼠标响应回调函数;

  • 第三个参数param:响应函数传递的参数
    利用鼠标事件完成绘图的代码例子

      import cv2
      import numpy as np
    
      def draw_circle(event,x,y,flags,param):
          if event == cv2.EVENT_LBUTTONDBLCLK:
              cv2.circle(img,(x,y),100,(255,0,0),-1)
    
      # 新建图像窗口并将窗口与回调函数绑定
      	img = np.zeros((512,512,3),np.uint8)
      cv2.namedWindow('image')
      cv2.setMouseCallback('image',draw_circle)
      while(1):
      	cv2.imshow('image',img)
      	if cv2.waitKey(20)&0xFF==27:
      		break
      cv2.destoryAllWindows()
    

#####3.Python中定义函数时,若想在函数内部对函数外的变量进行操作,就需要在函数内部声明其为global。

#八,图像的基础操作

#####1. 获取并修改像素值
>- img.item()
>- img.itemset()
获取修改像素值的详解
#####2. 获取图像的属性
#####图像的属性包括:行,列,通道,图像数据类型,像素数目等
#####img.shape():

  • 可以获取图像的形状,返回值是一个包含行数,列数,通道数的元组;

  • img.shape[:2]:取彩色图片的高宽;

  • img.shape[:3]:取彩色图片的高,宽,通道
    #####img.size:

  • 可以返回图像的像素数目
    #####img.dtype:

  • 可以返回图像的数据类型
    #####3. 图像ROI:ROI指感兴趣区域
    #####4. 将图片中某行某列拷贝到某行某列
    eg:

      img = cv2.imread('1.jpg')   
      ball = img[280:340,330:390]
      img[273:333,100:160] = ball  
    

#####5.拆分及合并图像通道
-cv2.split():通道分离函数,得到各个通道的灰度图
-cv2.merge():通道合并函数
python3+opencv 图像通道的分离(split()函数)和合并(merge()函数)
#####6. 为图像扩边(填充)
#####cv2.copyMakeBorder(): 用来给图片添加边框;

  • 第一个参数src:要处理的原图;
  • 第二~五个参数top,bottom,left,right:上下左右要扩展的像素数;
  • 第六个参数borderType:边框类型;
  • cv2.BORDER_CONSTANT 添加有颜色的常数值边界,还需要 下一个参数(value)
  • cv2.BORDER_REFLECT 边界元素的镜像。比如: fedcba|abcdefgh|hgfedcb
  • cv2.BORDER _ REFLECT _ 101 or cv2.BORDER _ DEFAULT 跟上面一样,但稍作改动。例如: gfedcb|abcdefgh|gfedcba
  • cv2.BORDER_REPLICATE 重复最后一个元素。例如: aaaaaa| abcdefgh|hhhhhhh
  • cv2.BORDER_WRAP 不知道怎么说了, 就像这样: cdefgh| abcdefgh|abcdefg
    图像扩边的代码示例
  • 第七个参数value :如果borderType设置为BORDER_CONSTANT(纯色边框),则这个参数为边框的颜色
    #####7.图像加法
    #####cv2.add():

  • 将两幅图像进行加法运算,两幅图像的大小,类型必须一致,或者第二个图像可以是一个简单的标量值。

      x = np.uint8([250])   
      y = np.uint8([10])   
      print(cv2.add(x,y))   
      [[255]]  #250+10=260=>255   
      print(x+y)   
      [4]#250+10=260%256=4    
    

#####8.图像减法
#####cv2.subtract():

  • 第一个参数src1:第一张图片
  • 第二个参数src2:第二张图片
  • 第三个参数dst:目标图像,需要提前分配空间,可省略
  • 第四个参数mask:8位单通道数组,指定要更改的输出数组的元素。
  • 第五个参数dtype:输出数组的深度,默认等于-1

#####9.图像混合
#####计算公式:g(x)=(1-a)f0(x)+af1(x)
#####cv2.addWeighted():

  • 将两个图像混合在一起;
  • 第一个参数src1:第一个原数组;
  • 第二个参数alpha:第一个数组元素权重;
  • 第三个参数src2:第二个原数组;
  • 第四个参数beta:第二个数组元素权重;
  • 第五个参数gamma:图1和图2作和后添加的数值。
    #####10.图像按位运算:
    #####bitwise_and(),bitwise_or(),bitwise_not():
  • 与掩膜进行运算;
  • 第一个参数src1:第一个输入数组或标量;
  • 第二个参数src2:第二个输入数组或标量;
  • 第三个参数dst:输出与输入具有相同大小和类型的数组;
  • 第四个参数:操作掩码;8位单通道数组,用于指定要更改的输出数组的元素
    按位运算的利用

#九,程序性能检测及优化

#####1. cv2.getTickCount():

  • 返回从参考点到这个函数被执行的时钟数;
    #####2. cv2.getTickFrequency():
  • 返回时钟频率,或者说每秒钟的时钟数;
    #####3. 一般情况下,Opencv的函数要比Numpy函数快。

#十,颜色空间转换
#####1. cv2.cvtColor():

  • 颜色空间转换函数,常用的转换函数有:BGR<->Gray,BGR<->HSV;
  • 第一个参数img:需要转换的图片;
  • 第二个参数flag:需要转换的类型;
  • BGR<->Gray:
    cv2.COLOR_BGR2GRAY
  • BGR<->HSV:cv2.COLOR_BGR2HSV

#####2.在OpenCV的HSV格式中,H(色彩/色度)的取值范围是[0,179],S(饱和度)的取值范围是[0,255],V(亮度)的取值范围[0,255]。
#####3. cv2.inRange():

  • 设置阈值,去除背景部分;

  • 第一个参数hsv:转换为HSV的图片,

  • 第二个参数lower_red:指图像中低于这个lower_red的值,图像值变为0;

  • 第三个参数upper_red:指图像中高于这个upper_red的值,图像值变为0;
    #####4. 用inRange()函数制作完掩膜后,将原图像和掩膜进行位运算;
    #####5. green = np.uint8([0,255,0])是错误的;应该是([[[0,255,0]]]);这里的三层括号分别对应cvArray,cvMat,IplImage
    #####6. 寻找对应颜色的HSV值的代码:

    green = np.uint8([[[0,255,0]]])
    hsv_green =cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
    print(hsv_green)

#十一,几何变换
#####1. cv2.resize():

  • 用于对图像进行尺度缩放,可以使用各种内插方法进行处理;
  • 第一个参数scr:原图;
  • 第二个参数dsize:输出图像的尺寸;
  • 第三个参数fx:沿水平轴的比例因子;
  • 第四个参数fy:沿垂直轴的比例因子;
  • 第五个参数interpolation:插值方法;

###5种插值方法:

  • INTER_NEAREST:最近邻插值法
  • INTER_LINEAR:双线性插值法(默认)
  • INTER_AREA:基于局部像素的重采样。对于图像抽取来说,这可能是一个封号的方法;但如果是放大图像是,它和最近邻法的效果类似。
  • INTER_CUBIC:基于 4x4像素邻域的3次插值法
  • INTER_LANCZOS4:基于 8x8像素邻域的Lanczos插值

#####如果要缩小图像,通常推荐使用INTER _ AREA插值效果最好,而要放大图像,通常使用INTER _ CUBIC(速度较慢,但效果最好),或者使用INTER _ LINEAR(速度较快,效果还可以)。
#####2.cv2.warpAffine():

  • 通过仿射,进行图像的平移;
  • 第一个参数是src:输入图像
  • 第二个参数M:变换矩阵
  • 第三个参数dsize : 输出图像的大小
  • 第四个参数flags:插值方法的组合(int类型)
  • 第五个参数borderMode:边界像素模式(int类型)
  • 第六个参数borderValue:(重点!)边界填充值,默认情况下为0
    #####3.cv2.getRotationMatrix2D():
  • 设定中心点和旋转角度来生成转换矩阵M
  • 第一个参数center:旋转的中心点,一般是图片的中心,用img.shape取得长宽,然后去一半
  • 第二个参数angle:旋转的角度,正值是逆时针旋转,负值是顺时针旋转
  • 第三个参数scale:缩放因子
    #####4. cv2.getAffineTransform():
  • 返回一个仿射变换矩阵
  • 第一个参数src:原始图像的三个点
  • 第二个参数dst:目标图像的三个点
    #####5. cv2.getPerspectiveTransform():
  • 返回一个仿射变换矩阵
  • 第一个参数src:原始图像的四个点;
  • 第二个参数dst:目标图像的四个点
    #####6.cv2.warpPerspective():
  • 第一个参数src:输入图像
  • 第二个参数M:变换矩阵
  • 第三个参数dsize:目标图像的大小
  • 第四个参数flags:插值方式
  • 第五个参数borderMode:边界补偿的方式
  • 第六个参数borderValue:边界补偿大小
    #####7. cv2.perspectiveTransform():
  • 第一个参数src:输入的2通道或者3通道的图片
  • 第二个参数M:变换矩阵
  • 返回相同size的图片
    #####8.区别:warpPerspective适用于图像;perspectiveTransform适用于一组点

#十二,图像阈值

#####1. cv2.threshold():简单阈值,一般是灰度图

  • 第一个参数src:原图像,可以为8位的灰度图,也可以为32位的彩色图像
  • 第二个参数dst:输出图像
  • 第三个参数thresh:阈值
  • 第四个参数maxval:dst图像中的最大值
  • 第五个参数type:阈值类型
    阈值类型
    #####2.cv2.adaptiveThreshold():自适应阈值二值化,根据图片一小块区域的值来计算对应区域的阈值
  • 第一个参数src:原图,只能输入单通道图像,通常来说为灰度图
  • 第二个参数dst:输出图
  • 第三个参数maxval:当像素值超过了阈值(或者小于阈值,根据type来决定)所赋予的值
  • 第四个参数thresh_type:阈值的计算方法,包含两种类型:
  • cv2.ADAPTIVE _ THRESH_MEAN _ C
  • cv2.ADAPTIVE_THRESH _ GAUSSIAN _ C
  • 第五个参数type:二值化操作的类型,与固定阈值函数相同,包含以下5种类型:
  • cv2.THRESH _ B
    INARY
  • cv2.THRESH _ BINARY_INV
  • cv2.THRESH _ TRUNC
  • cv2.THRESH _ TOZERO
  • cv2.THRESH _ TOZERO _ INV
  • 第六个参数Block Size :图片中分块的大小
  • 第七个参数C:阈值计算方法中的常数项
    自适应阈值二值化示例

#十三,图像模糊:OpenCV的滤波与卷积

#####1. numpy.one():创建数组

  • 第一个参数shape:定义返回元组的形状, 传入int或ints元组, 如果传入int,返一维数组,如果传入ints元组,返回多维数组。

      np.ones(shape=(5,4))  # 返回一个5行4列的数组,元素的内容都为1
    
  • 第二个参数dtype:定义的数据类型,可选参数。默认numpy.float64。例如:numpy.int8

      ones = np.ones(shape=(3,2,3), dtype=int)  # 返回3个两行三列都为1的数组
    
  • 第三个参数order:可选, 返回多维数组时,内存的排列方式

numpy的使用

#####2. cv2.filter2D():对一幅图像进行卷积操作

  • 第一个参数src:输入图像
  • 第二个参数dst:输出图像
  • 第三个参数kernel:卷积核, 单通道浮点矩阵。 如果想要应用不同的核于不同的通道,先用 cvSplit 函数分解图像到单个色彩通道上,然后单独处理。
  • 第四个参数anchor:核的锚点表示一个被滤波的点在核内的位置。 锚点应该处于核内部。默认值 (-1,-1) 表示锚点在核中心
    卷积和相关模板
    卷积模板及程序实例

#####3.LPF(低通滤波) 帮助我们去除噪音,模糊图像。HPF(高通滤波) 帮助我们找到图像的边缘

#####4.cv2.blur():均值滤波,典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。

  • 第一个参数img:输入图片
  • 第二个参数表示进行均值滤波的方框大小

#####5.cv2.boxFilter():表示进行方框滤波

  • 第一个参数src:输入图像
  • 第二个参数ddepth:处理结果图像的图像深度,一般使用1 表示与原始图像使用相同的图像深度
  • 第三个参数ksize:滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高度和宽度。
  • 第四个参数anchor:锚点,其默认值是(1,-1),表示当前计算均值的点位于核的中心点位置。该值使用默认值即可,在特殊情况下可以指定不同的点作为锚点
  • 第五个参数normalize:表示在滤波时是否进行归一化(这里指将计算结果规范化为当前像素值范围内的值)处理,该参数是一个逻辑值,可能为真值为 1)或假(值为 0)
  • 当参数 normalize = 1时,表示要进行归一化处理,要用邻域像素值的和除以面积
  • 当参数 normalize =0时,表示不需要受进行一化处理,直接使用邻域像素值的和
  • 当normalize = True则相当于均值滤波了,作用与cv2.blur()的作用一样
  • normalize=False,表示对加和后的结果不进行平均操作,大于255的使用255表示

#####6.cv2.GaussianBlur():一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程

  • 第一个参数src:输入图像
  • 第二个参数dst:输出图像的大小和类型与src相同。
  • 第三个参数ksize:高斯内核大小。 ksize.width和ksize.height可以不同,但​​它们都必须为正数和奇数,也可以为零,然后根据sigma计算得出。
  • 第四个参数sigmaX:X方向上的高斯核标准偏差
  • 第五个参数sigmaY:Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出;

#####7.cv2.medianBlur():一种典型的非线性滤波,是基于排序统计理论的一种能够有效抑制噪声的非线性信号处理技术,基本思想是用像素点邻域灰度值的中值来代替该像素点的灰度值,让周围的像素值接近真实的值从而消除孤立的噪声点

  • 第一个参数src:输入图像,当模板尺寸为3或5时,图像深度只能为CV _ 8U、CV _ 16U、CV _ 32F中的一个,如而对于较大孔径尺寸的图片,图像深度只能是CV _ 8U
  • 第二个参数dst:输出图像
  • 第三个参数ksize:滤波模板的尺寸大小,必须是大于1的奇数,如3、5、7……

#####8.cv2.bilateralFilter():双边滤波,能在保持边界清晰的情况下有效的去除噪音,但是这种操作与其他滤波器相比会比较慢;是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折中处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。

  • 第一个参数src:输入图像
  • 第二个参数d:在过滤期间使用的每个像素邻域的直径。如果输入d非0,则sigmaSpace由d计算得出,如果sigmaColor没输入,则sigmaColor由sigmaSpace计算得出
  • 第三个参数sigmaColor:色彩空间的标准方差,一般尽可能大。较大的参数值意味着像素邻域内较远的颜色会混合在一起,从而产生更大面积的半相等颜色。
  • 第四个参数sigmaSpace:坐标空间的标准方差(像素单位),一般尽可能小。参数值越大意味着只要它们的颜色足够接近,越远的像素都会相互影响。当d > 0时,它指定邻域大小而不考虑sigmaSpace。 否则,d与sigmaSpace成正比。
    双边滤波

#十四,形态学转换

#####1. cv2.erode():腐蚀,把前景物体的边界腐蚀掉(但是前景仍然是白色)。

  • 第一个参数src:原图像
  • 第二个参数dst:目标图像
  • 第三个参数element:腐蚀操作的内核。 如果不指定,默认为一个简单的 3x3 矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement().
  • 第四个参数anchor:默认为Point(-1,-1),内核中心点。省略时为默认值。
  • 第五个参数iterations:腐蚀次数。省略时为默认值1。
  • 第六个参数borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT,省略时为默认值。
  • 第七个参数borderValue:边缘值,具体可参见createMorphoogyFilter函数。可省略。
    图像腐蚀

#####2. getStructuringElement():制作操作内核。

  • 第一个参数shape::内核形状,主要有MORPH_RECT,MORPH_CROSS和MORPH_ELLIPSE,分别为矩形、椭圆形和交叉形,对应的值分别为0,1,2
  • 第二个参数esize:内核大小
  • 第三个参数anchor:内核锚点,默认为内核中心点

#####3. cv2.dilate():膨胀,会增加图像中的白色区域(前景)。

  • 第一个参数src:原图像
  • 第二个参数dst:目标图像
  • 第三个参数element:腐蚀操作的内核。 如果不指定,默认为一个简单的 3x3 矩阵。否则,我们就要明确指定它的形状,可以使用函数getStructuringElement().
  • 第四个参数anchor:默认为Point(-1,-1),内核中心点。省略时为默认值。
  • 第五个参数iterations:腐蚀次数。省略时为默认值1。
  • 第六个参数borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT,省略时为默认值。borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT,省略时为默认值。
  • 第七个参数borderValue:边缘值,具体可参见createMorphoogyFilter函数。可省略。

#####4. 开运算:先腐蚀后膨胀,用来去除噪音,排除小团的物体;
#####5. 闭运算:先膨胀后腐蚀,被用来填充前景物体中的小洞,或者前景物体上的小黑点
#####6. 形态学梯度:图像膨胀与腐蚀之差,可以保留物体的边缘轮廓
#####7. 顶帽:原始图像和进行开运算之后的图像的差,突出原图像中比周围亮的区域
#####8. 黑帽:进行闭运算之后的图像与原始图像之差,突出原图像中比周围暗的区域

#####9. cv2.morphologyEx():函数是一种形态学变化函数。数学形态学可以理解为一种滤波行为,因此也称为形态学滤波。滤波中用到的滤波器(kernal),在形态学中称为结构元素。结构元素往往是由一个特殊的形状构成,如线条、矩形、圆等。

  • 第一个参数src:输入图像
  • 第二个参数dst:输出图像
  • 第三个参数method:使用的形态学方法:形态学方法名字
  • MORPH_OPEN —— 开运算:对图像先腐蚀再膨胀,可以排除小团的物体
  • MORPH_CLOSE —— 闭运算:对图像先膨胀再腐蚀,可以排除小型黑洞
  • MORPH_GRADIENT —— 形态学梯度:图像膨胀与腐蚀之差,可以保留物体的边缘轮廓
  • MORPH_TOPHAT —— “顶帽”:原始图像和进行开运算之后的图像的差,突出原图像中比周围亮的区域
  • MORPH_BLACKHAT —— “黑帽”:进行闭运算之后的图像与原始图像之差,突出原图像中比周围暗的区域
  • 第四个参数kernel:形态学运算内核;
  • 第五个参数anchor:默认为Point(-1,-1),内核中心点。省略时为默认值。
  • 第六个参数:borderType:推断边缘类型,具体参见borderInterpolate函数。默认为BORDER_DEFAULT,省略时为默认值。
  • 第七个参数borderValue:边缘值,具体可参见createMorphoogyFilter函数。可省略。

#十五,图像梯度

#####1. cv2.Sobel():Sobel算子,是高斯平滑与微分操作的结合体,所以它的抗噪声能力很好。

  • 第一个参数src:输入图像
  • 第二个参数ddepth:输出图像的深度(可以理解为数据类型),-1表示与原图像相同的深度
  • 第三,第四个参数dx,dy:当组合为dx=1,dy=0时求x方向的一阶导数,当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常得不到想要的结果)
  • 第五个参数ksize:(可选参数)Sobel算子的大小,必须是1,3,5或者7,默认为3。
  • 第六个参数scale:(可选参数)将梯度计算得到的数值放大的比例系数,效果通常使梯度图更亮,默认为1
  • 第七个参数delta:(可选参数)在将目标图像存储进多维数组前,可以将每个像素值增加delta,默认为0
  • 第八个参数borderType:(可选参数)决定图像在进行滤波操作(卷积)时边沿像素的处理方式,默认为BORDER_DEFAULT
    Sobel算子和图像深度

#####2. cv2.Scharr():Scharr算子,如果 ksize=-1,会使用 3x3 的 Scharr 滤波器,它的的效果要比 3x3 的 Sobel 滤波器好(而且速度相同,所以在使用 3x3 滤波器时应该尽量使用 Scharr 滤波器);Scharr仅作用于大小为3的内核。具有和sobel算子一样的速度,但结果更为精确

  • 第一个参数src:输入图像
  • 第二个参数ddepth:输出图像的深度(可以理解为数据类型),-1表示与原图像相同的深度
  • 第三,第四个参数dx,dy:当组合为dx=1,dy=0时求x方向的一阶导数,当组合为dx=0,dy=1时求y方向的一阶导数(如果同时为1,通常得不到想要的结果)
  • 第五个参数ksize:(可选参数)Scharr算子的大小,必须为3。
  • 第六个参数scale:(可选参数)将梯度计算得到的数值放大的比例系数,效果通常使梯度图更亮,默认为1
  • 第七个参数delta:(可选参数)在将目标图像存储进多维数组前,可以将每个像素值增加delta,默认为0
  • 第八个参数borderType:(可选参数)决定图像在进行滤波操作(卷积)时边沿像素的处理方式,默认为BORDER_DEFAULT

#####3. cv2.Laplacian(): 利用sobel算子的运算。它通过加上sobel算子运算出的图像x方向和y方向上的导数,来得到我们载入图像的拉普拉斯变换结果。

  • 第一个参数src:输入图像,需要单通道8位图
  • 第二个参数dst:输出图像
  • 第三个参数ddept:目标图像的深度。
  • 第四个参数ksize:用于计算二阶导数的滤波器的孔径尺寸,大小必须为正奇数,且有默认值1
  • 第五个参数scale:计算拉普拉斯值的时候可选的比例因子,有默认值1。
  • 第六个参数delta:表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。
  • 第七个参数borderType:边界模式,默认值为BORDER_DEFAULT。这个参数可以在官方文档中borderInterpolate()处得到更详细的信息。

#####4. 当我们可以通过参数 -1 来设定输出图像的深度(数据类型)与原图像保持一致,但是我们在代码中使用的却是 cv2.CV _ 64F。这是为什么呢?想象一下一个从黑到白的边界的导数是整数,而一个从白到黑的边界点导数却是负数。如果原图像的深度是np.uint8 时,所有的负值都会被截断变成 0,换句话说就是把把边界丢失掉。所以如果这两种边界你都想检测到,最好的的办法就是将输出的数据类型设置的更高,比如 cv2.CV _ 16S,cv2.CV _ 64F 等。取绝对值然后再把它转回到 cv2.CV _ 8U。

#十六,Canny边缘检测:边缘检测和轮廓检测的区别

#####1. cv2.Canny():探测图像边缘

  • 第一个参数src:输入图像,只能是灰度图
  • 第二个参数minVal:最小阈值:必须minVal:maxVal == 1:3或1:2
  • 第三个参数maxVal:最大阈值
  • 第四个参数ksize:卷积核的大小,默认值是3
  • 第五个参数L2gradient:是一个布尔值,如果为真,则使用更精确的L2范数进行计算(即两个方向的倒数的平方和再开放),否则使用L1范数(直接将两个方向导数的绝对值相加),默认值为False
    边缘检测示例1
    边缘检测示例2

#十七,图像金字塔

#####1. pyrup和pyrdown函数只能固定对图像进行长宽二倍或半倍的缩小和放大,不能是其他大小

#####2. cv2.pyrDown():从一个高分辨率大尺寸的图像向上构建一个金子塔(尺寸变小,分辨率降低),对图片做向下采样操作,通常也可以做模糊化处理

  • 第一个参数src:表示输入图像
  • 第二个参数dst:表示输出图像
  • 第三个参数dstsize:表示输出图像的大小
  • 第四个参数borderType:表示图像边界的处理方式

#####3. cv2.pyrUp():从一个低分辨率小尺寸的图像向下构建一个金子塔(尺寸变大,但分辨率不会增加)。

  • 第一个参数src:表示输入图像
  • 第二个参数dst:表示输出图像
  • 第三个参数dstsize:表示输出图像的大小
  • 第四个参数borderType:表示图像边界的处理方式

#####4. 拉普拉斯金字塔计算公式:Li=Gi-pyrUp(Gi+1), 其中i和i+1为下角标

import cv2
import numpy as np
img=cv2.imread('C:\\Users\\WLX\\Desktop\\2.jpg',0)
img1=cv2.pyrDown(img)
img2=cv2.pyrUp(img1)
img3=img-img2#laplace金字塔
cv2.imshow('img',img)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)
cv2.imshow('img3',img3)
cv2.waitKey(0)

#####5.使用金字塔进行图像融合

#十八,OpenCV中的轮廓

#####1. 为了更加准确,要使用二值化图像。在寻找轮廓之前,要进行阈值化处理或者 Canny 边界检测。

#####2. 在 OpenCV 中,查找轮廓就像在黑色背景中超白色物体。你应该记住,要找的物体应该是白色而背景应该是黑色

#####3.cv2.findContours():在二值图像中查找轮廓

  • 第一个参数src:输入图像,为二值图像
  • 第二个参数contours:轮廓检索方式;
  • cv2.RETR_EXTERNAL:只检测外轮廓
  • cv2.RETR_LIST:检测的轮廓不建立等级关系
  • cv2.RETR_C
    COMP:建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息
  • cv2.RETR_TREE:建立一个等级树结构的轮廓
  • 第三个参数hierarchy:轮廓近似办法;
  • cv2.CHAIN_ APPROX_NONE:存储所有边界点
  • cv2.CHAIN _APPROX _SIMPLE:压缩垂直、水平、对角方向,只保留端点
    -cv2.CHAIN _ APPROX _ TX89 _ L1: 使用teh-Chini近似算法
  • cv2.CHAIN _ APPROX _ TC89 _ KCOS: 使用teh-Chini近似算法
  • 三个返回值:图像,轮廓,轮廓的层析结构
    轮廓检索方式和轮廓近似方式的解析
    #####4.cv2.drawContours():绘制轮廓,根据你提供的边界点绘制任何形状
  • 第一个参数src:原图像,注意会改变原图
  • 第二个参数contours:轮廓点,为cv2.findContours()函数的第一个返回值
  • 第三个参数:contourldx:轮廓的索引,表示绘制第几个轮廓,-1表示绘制所有的轮廓
  • 第四个参数color:绘制轮廓的颜色
  • 第五个参数thickness:(可选参数)轮廓线的宽度,-1表示填充
  • 第六个参数lineType:(可选参数):轮廓线型,包括cv2.LINE _ 4,cv2.LINE _ 8(默认),cv2.LINE _ AA,分别表示4邻域线,8领域线,抗锯齿线(可以更好地显示曲线)
  • 第七个参数hierarchy(可选参数):层次结果,cv2.findContours()函数的第二个返回值,配合maxLevel参数使用
  • 第八个参数maxLevel:(可选参数)等于0表示只绘制指定的轮廓,等于1表示绘制指定轮廓及其下一级子轮廓,等于2表示绘制指定轮廓及其所有子轮廓
  • 第九个参数offset:(可选参数)轮廓点的偏移量

#####5. cv2.moments():将计算得到的矩以一个字典的形式返回

  • 第一个参数src:输入图像

  • 第二个参数binaryimage:默认值是false,如果为true,则所有非零的像素都会按值1对待,也就是说相当于对图像进行了二值化处理,阈值为1

  • 根据这些矩的值,可以计算出对象的重心:Cx = M10/M00,Cy = M01/M00

      cx = int(M['m10']/M['m00'])
      cy = int(M['m01']/M['m00'])
    

#####6. cv2.contourArea():返回轮廓的面积

  • 第一个参数cnt:由图像的轮廓点组成的点集

#####7. cv2.arcLength():返回轮廓的周长即弧长

  • 第一个参数cnt:由图像的轮廓点组成的点集
  • 第二个参数bool:以用来指定对象的形状是闭合的(True),还是打开的(一条曲
    线)

#####8. cv2.approxPolyDP():把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合。

  • 第一个参数cnt:由图像的轮廓点组成的点集

  • 第二个参数approxCurve:输出折线

  • 第三个参数epsilon:是从原始轮廓到近似轮廓的最大距离。它是一个准确度参数

  • 第四个参数bool:表示输出的多边形是否闭合,以用来指定对象的形状是闭合的(True),还是打开的(一条曲
    线)

      epsilon = 0.1*cv2.arcLength(cnt,True)
      approx = cv2.approxPolyDP(cnt,epsilon)
    

#####9. cv2.convexHull():以用来检测一个曲线是否具有凸性缺陷,并能纠正缺陷。

  • 第一个参数points:传入轮廓
  • 第二个参数hull:输出,通常不需要
  • 第三个参数clockwise:方向标志。如果设置为 True,输出的凸包是顺时针方向的。否则为逆时针方向。
  • 第四个参数returnPoints:默认值为 True。它会返回凸包上点的坐标。如果设置为 False,就会返回与凸包点对应的轮廓上的点。
    凸包检测示例
    #####10. cv2.isContourConvex():用来检测一个曲线是不是凸的。它只能返回 True 或 False
  • 第一个参数cnt:由图像的轮廓点组成的点集

#####11. cv2.boundingRect():计算轮廓的垂直边界最小矩形,矩形是与图像上下边界平行的,一个直矩形(就是没有旋转的矩形)。它不会考虑对象是否旋转。所以边界矩形的面积不是最小的。

  • 第一个参数cnt:由图像的轮廓点组成的点集

      x,y,w,h = cv2.boundingRect(cnt)
      img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
      其中(x,y)为矩形左上角坐标,(w,h)是矩形的宽和高
    

#####12. cv2.minAreaRect():

  • 第一个参数cnt:由图像的轮廓点组成的点集
  • 返回一个
  • 2D结构,其中包含矩形左上角角点的坐标(x,y),矩形的宽和高(w,h),以及旋转角度。绘制这个矩形需要矩形的 4 个角点,可以通过函数cv2.boxPoints() 获得。

#####13.cv2.boxPoints():

  • 第一个参数rect:为cv2.minAreaRect()函数的返回值;

  • 返回一个旋转矩阵的四个顶点

      rect = cv2.minAreaRect(cnt)
      box = cv2.boxPoints(rect)
      print (box) 
      box = np.int0(box)
      cv2.drawContours(frame,[box], 0, (0, 0, 255), 2)
    

#####14.cv2.minEnclosingCircle():可以帮我们找到一个对象的外切圆。它是所有能够包括对象的圆中面积最小的一个

  • 第一个参数cnt:由图像的轮廓点组成的点集

  • 返回值center:最小外切圆的中心点

  • 返回值radius:最小外切圆的半径

      (x,y),radius = cv2.minEnclosingCircle(cnt)
      center = (int(x),int(y))
      radius = int(radius)
      img = cv2.circle(img,center,radius,(0,255,0),2)
    

#####15. cv2.fitEllipse():返回一个旋转边界矩形的内切椭圆

  • 平时我们用cv2.ellipse来画椭圆的时候,给定的长短轴都是半轴的长度,用cv2.fitEllipse拟合出来的是半轴的双倍长度。在用cv2.ellipse绘制的时候注意,如果直接用cv2.fitEllipse拟合出来的参数绘制,可以直接将拟合参数作为cv2.ellipse的参数,而不必将长短轴除以2
  • 第一个参数cnt:由图像的轮廓点组成的点集,最少也要大于5个点的点集

#####16. cv2.fitLine():

  • 第一个参数cnt:由图像的轮廓点组成的点集
  • 第二个参数line:输出的直线,对于二维直线而言类型为cv::Vec4f,对于三维直线类型则是cv::Vec6f,输出参数的前半部分给出的是直线的方向,而后半部分给出的是直线上的一点(即通常所说的点斜式直线)。
  • 第三个参数distType:距离类型
  • cv2.DIST_USER : User defined distance
  • cv2.DIST_L1: distance = |x1-x2| + |y1-y2|
  • cv2.DIST_L2: 欧式距离,此时与最小二乘法相同
  • cv2.DIST_C:distance = max(|x1-x2|,|y1-y2|)
  • cv2.DIST_L12:L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
  • cv2.DIST_FAIR:distance = >- c^2(|x|/c-log(1+|x|/c)), c = 1.3998
  • cv2.DIST_WELSCH: distance = c2/2(1-exp(-(x/c)2)), c = 2.9846
  • cv2.DIST_HUBER:distance = |x|
  • 第四个参数param:距离参数,跟所选的距离类型有关,值可以设置为0
  • 第五,六个参数:用于表示拟合直线所需要的径向和角度精度,通常情况下两个值均被设定为1e-2.
    #十九. 轮廓的性质

#####1. 边界矩形的长宽比:
Aspect Ration = Width / Height

#####2. Extent:轮廓面积与边界矩形面积的比。
Extent = Object Area / Bounding Rectangle Area

#####3. Solidity:轮廓面积与凸包面积的比。
Solidity = Contour Area / Convex Hull Area

#####4. Equivalent Diameter:与轮廓面积相等的圆形的直径
Equivalent Diameter = sqrt(4 x Contour Area) / pi

#####5. 方向:对象的方向,下面的方法还会返回长轴与短轴的长度
(x,y),(MA,ma),angl = cv2.fitEllipse(cnt)

#####6. 掩膜和像素点:有时我们需要构成对象的所有像素点,我们可以这样做:

mask = np.zeros(imgray.shape,np.uint8)
cv2.drawContours(mask,[cnt],0,255,-1)
pixelpoints = np.transpose(np.nonzero(mask))
#pixelpoints = cv2.findNonZero(mask)

这里我们是用来两种方法,第一e种方法使用了 Numpy 函数,第二种使用
了 OpenCV 函数。结果相同,但还是有点不同。Numpy 给出的坐标是(row,
colum)。形式的。而 OpenCV 给出的格式是(x,y)形式的。所以这两个结果基本是可以互换的。row=x,colunm=y。

#####7. 最大值和最小值及它们的位置cv2.minMaxLoc():设有一个矩阵a,现在需要求这个矩阵的最小值,最大值,并得到最大值,最小值的索引

  • 第一个参数src:一个矩阵

    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)

#####8.平均颜色及平均灰度cv2.mean():使用相同的掩模求一个对象的平均颜色或平均灰度

mean_val = cv2.mean(im,mask = mask)

#####9.极点:一个对象最上面,最下面,最左边,最右边的点。

leftmost = tuple(cnt[cnt[:,:,0].argmin()][0])
rightmost = tuple(cnt[cnt[:,:,0].argmax()][0])
topmost = tuple(cnt[cnt[:,:,1].argmin()][0])
bottommost = tuple(cnt[cnt[:,:,1].argmax()][0])

#二十,轮廓:更多函数

#####1.cv2.convexityDefect():帮助我们找到凸缺陷

  • 第一个参数cnt:由图像的轮廓点组成的点集

  • 第二个参数hull:cv2.convexHull所找到的凸包

  • 如果要查找凸缺陷,在使用函数 cv2.convexHull 找凸包时,参数
    returnPoints 一定要是 False。

  • 它会返回一个数组,其中每一行包含的值是 [起点,终点,最远的点,到最
    远点的近似距离]。我们可以在一张图上显示它。我们将起点和终点用一条绿线
    连接,在最远点画一个圆圈,要记住的是返回结果的前三个值是轮廓点的索引。
    所以我们还要到轮廓点中去找它们。

      hull = cv2.convexHull
      (cnt,returnPoints = False)#这里一定要是False
      defects = cv2.convexityDefects(cnt,hull)
    

#####2. cv2.pointPolygonTest():求解图像中的一个点到一个对象轮廓的最短距离。如果点在轮廓的外部,返回值为负。如果在轮廓上,返回值为 0。如果在轮廓内部,返回值为正。

  • 第一个参数cnt:由图像的轮廓点组成的点集
  • 第二个参数point:要测量的目标点
  • 第三个参数bool:如果设置为 True,就会计算最短距离。如果是 False,只会判断这个点与轮廓之间的位置关系(返回值为+1,-1,0)。
  • 如果你不需要知道具体距离,建议你将第三个参数设为 False,这样速
    度会提高 2 到 3 倍。

#####3. cv2.matchShape():帮我们比较两个形状或轮廓的相似度,如果返回值越小,匹配越好;完全相同的图像返回值是0,返回值最大是1

  • 第一个参数contour1:第一个轮廓
  • 第二个参数contour2:第二个轮廓
  • 第三个参数method:比较的方法
  • CV_CONTOUR_MATCH_I1
  • CV_CONTOURS_MATCH_I2
  • CV_CONTOURS_MATCH_I3
  • 第四个参数parameter:方法相应的参数

#####4.Hu 矩是归一化中心矩的线性组合,之所以这样做是为了能够获取代表图像的某个特征的矩函数,这些矩函数对某些变化如缩放,旋转,镜像映射(除了 h1)具有不变形

#二十一,轮廓的层次结构

#####1. 通常我们使用函数 cv2.findContours 在图片中查找一个对象。有时对象可能位于不同的位置。还有些情况,一个形状在另外一个形状的内部。这种情况下我们称外部的形状为父,内部的形状为子。按照这种方式分类,一幅图像中的所有轮廓之间就建立父子关系。这样我们就可以确定一个轮廓与其他轮廓是怎样连接的,比如它是不是某个轮廓的子轮廓,或者是父轮廓。这种关系就成为组织结构

#####2. OpenCV 使用一个含有四个元素的数组表示。[Next,Previous,First_Child,Parent]。

  • Next 表示同一级组织结构中的下一个轮廓。
  • Previous 表示同一级结构中的前一个轮廓。
  • First_Child 表示它的第一个子轮廓。
  • Parent 表示它的父轮廓。

#二十二,直方图的计算,绘制与分析

#####1. 什么是直方图?

  • ?通过直方图你可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值(0 到 255),y 轴是图片中具有同一个灰度值的点的数目。(直方图是根据灰度 图像绘制的,而不是彩色图像)

#####2. BINS:将[0,255]的像素数进行分组,每个小组就被成为BIN

#####3. DIMS:表示我们收集数据的参数数目,一般来说,我们对收集到的数据值考虑一件事:灰度值,就是1

#####4. RANGE:要统计的灰度值范围,一般来说为[0,256]

#####5. cv2.calcHist():帮助我们统计一幅图像的直方图

  • 第一个参数image: 原图像(图像格式为 uint8 或 float32)。当传入函数时应该用中括号 [] 括起来,例如:[img]。
  • 第二个参数channels:同样需要用中括号括起来,它会告诉函数我们要统计那幅图像的直方图。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像
    的话,传入的参数可以是 [0],[1],[2] 它们分别对应着通道 B,G,R,如果是绘制2D直方图(H和S两个通道),需要[0,1]
  • 第三个参数mask:掩模图像。要统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并
    使用它。
  • 第四个参数histSize:BIN的数目,也应该用中括号括起来,如果绘制2D直方图,需要[180,256](H通道为180,S通道为256)
  • 第五个参数ranges:像素值范围,通常为 [0,256],如果绘制2D直方图,则需要[0,180,0,256](H的取值范围在0到180,S的取值范围在0到256)

#####6. plt.hist():绘制直方图

  • 第一个参数x:数据

  • 第二个参数bins:条形数

  • 第三个参数color:颜色

  • 第四个参数density:是否以密度的形式显示,bool类型

  • 第五个参数range:x轴的范围

  • 第六个参数bottom:y轴的起始位置

  • 第七个参数histtype:线条的类型;“bar”:方形,“barstacked”:柱形,“step”:“未填充线条”,“stepfilled”:“填充线条”

  • 第八个参数align:对齐的方式;“left”:左,“mid”:中间,“right”:右

  • 第九个参数orientation: “horizontal”:水平,“vertical”:垂直

  • 第十个参数log:单位是否以科学计数法;bool类型

      img = cv2.imread('home.jpg',0)
      plt.hist(img.ravel(),256,[0,256]);
      plt.show()
    

img = cv2.imread('home.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
	histr = cv2.calcHist([img],[i],None,[256],[0,256])
	plt.plot(histr,color = col)
	plt.xlim([0,256])
plt.show()

#####7. 要统计图像某个局部区域的直方图只需要构建一副掩模图像。将要统计的部分设置成白色,其余部分为黑色,就构成了一副掩模图像。然后把这个掩模图像传给函数就可以了。

img = cv2.imread('home.jpg',0)

# create a mask
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:400] = 255
masked_img = cv2.bitwise_and(img,img,mask = mask)

# Calculate histogram with mask and without mask
# Check third argument for mask
hist_full = cv2.calcHist([img],[0],None,[256],[0,256])
hist_mask = cv2.calcHist([img],[0],mask,[256],[0,256])
plt.subplot(221), plt.imshow(img, 'gray')
plt.subplot(222), plt.imshow(mask,'gray')
plt.subplot(223), plt.imshow(masked_img, 'gray')
plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)
plt.xlim([0,256])

plt.show()

#####8. 直方图均衡化的作用:直方图均衡化经常用来使所有的图片具有相同的亮度条件的参考工具。这在很多情况下都很有用。例如,脸部识别,在训练分类器前,训练集的所有图片都要先进行直方图均衡化从而使它们达到相同的亮度条件。
直方图均衡化要注意的各个点

#####9. cv2.equalizeHist():

  • 第一个参数src:要均衡化的原图像的灰度图

  • 返回一个均衡化后的图像

      img = cv2.imread('5.jpg',0)
      equ = cv2.equalizeHist(img)
      res = np.hstack((img,equ))  #两个图片的像素分布连接在一起,拍成一维数组
      cv2.imshow('image',res)
      cv2.waitKey(0)
    

#####10. ,由于太亮我们丢失了很多信息。造成这种结果的根本原因在于这幅图像的直方图并不是集中在某一个区域

#####11. cv2.createCLAHE():自适应的直方图均衡化

  • 第一个参数clipLimit:颜色对比度的阈值

  • 第二个参数 titleGridSize:进行像素均衡化的网格大小,即在多少网格下进行直方图的均衡化操作(默认是(8,8))

      img = cv2.imread('5.jpg',0)
      clahe = cv2.createCLAHE(clipLimit=2,tileGridSize=(8,8))
      cll = clahe.apply(img)#把clahe这种局部直方图均衡化应用到灰度图gray
    

#####12.np.histogram2d():绘制2D直方图

  • 第一个参数h:H通道的数据样本

  • 第二个参数s:S通道的数据样本

  • 第三个参数bins:BIINS的数目

  • 第四个参数range:两个数据样本的数值范围

      img = cv2.imread('5.jpg')
      hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
      h,s,v = cv2.split(hsv)
      
      hist = cv2.calcHist([hsv],[0,1],None,[180,256],[0,180,0,256])
    
      #hist,xbins,ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
      
      cv2.imshow('image',hist)
      cv2.waitKey(0)
    

#####13. OpenCV 提供的函数 cv2.calcBackProject() 可以用来做直方图反向投影。它的参数与函数 cv2.calcHist 的参数基本相同。其中的一个参数是我们要查找目标的直方图。同样再使用目标的直方图做反向投影之前我们应该先对其做归一化处理。返回的结果是一个概率图像,我们再使用一个圆盘形卷积核对其做卷操作,最后使用阈值进行二值化。

#####14. 直方图反向投影的概述:反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式,简单来讲,反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的特征。反向投影在某一位置的值就是原图对应位置像素值在原图像中的总数目。

#####15.直方图反向投影的作用:它可以用来做图像分割,或者在图像中找寻我们感兴趣的部分。简单来说,它会输出与输入图像(待搜索)同样大小的图像,其中的每一个像素值代表了输入图像上对应点属于目标对象的概率。用更简单的话来解释,输出图像中像素值越高(越白)的点就越可能代表我们要搜索的目标(在输入图像所在的位置)。这是一个直观的解释。直方图投影经常与 camshift算法等一起使用。

#####16. cv2.calcBackProject():

  • 第一个参数src:输入图像,图像深度必须位CV _ 8U,CV _ 16U或CV _ 32F中的一种,尺寸相同,每一幅图像都可以有任意的通道数,传入时应该用中括号[ ]括起来。
  • 第二个参数channels:用于计算反向投影的通道列表,通道数必须与直方图维度相匹配
  • 第三个参数hist:表示输入的模板图像直方图。
  • 第四个参数ranges:表示直方图中每个维度bin的取值范围 (即每个维度有多少个bin)
  • 第五个参数scale:表示可选输出反向投影的比例因子,一般取1。

#####17.cv2.normalize():归一化函数,把需要处理的数据经过处理后(通过某种算法)限制在你需要的一定范围内。

  • 第一个参数src:表示输入数组
  • 第二个参数dst:输出与src相同大小的数组,支持原地运算。
  • 第三个参数alpha:表示range normalization模式的最小值。
  • 第四个参数beta:表示range normalization模式的最大值,不用于norm normalization(范数归一化)模式。
  • 第五个参数norm_type:归一化的类型
  • NORM_MINMAX:数组的数值被平移或缩放到一个指定的范围,线性归一化,一般较常用。
  • NORM_INF:归一化数组的C-范数(绝对值的最大值)。
  • NORM_L1:归一化数组的L1-范数(绝对值的和)。
  • NORM_L2:归一化数组的(欧几里德)L2-范数。

直方图反向投影的示例

#二十三,图像变换:傅里叶变换相关步骤

#####1. cv2.dft():进行傅里叶变换

  • 第一个参数img:表示输入的图片,需要先转换成np.float32格式
  • 第二个参数method:表示进行傅里叶变化的方法:cv2.DFT _ COMPLEX _ OUTPUT
  • 返回的结果是双通道的(实部,虚部),通常还需要转换成图片格式才能展现,(0,255)

#####2. cv2.idft():进行傅里叶的逆变换

  • 第一个参数img:表示经过傅里叶变换后的图片,需要先转换成np.float32格式

#####3. np.fft.fftshift():将图像中的的低频部分移动到图像的中心

  • 第一个参数img:表示输入的图片

#####4. np.fft.ifftshift():将图像的低频和高频部分移动到图像原来的位置

  • 第一个参数img:表示输入的图片

#####5. cv2.magnitude(x,y):将sqrt(x2+y2)计算矩阵维度的平方根

  • 第一个参数x:x的平方数
  • 第二个参数y:y的平方数

#####6. 傅里叶变换:将图像从空间域转换为频率域

#####7. 高频指变化剧烈的灰度分量,即图像边界的地方, 低频指变换缓慢的灰度分量

#####8. 构建出的傅里叶变化的图片,将低频移到中间位置, 通常呈现中间亮,周围暗,是因为对于低频而言,波动较大,比如红色那条线,因此呈现亮,对于高频而言,波动较小,比如蓝色那条线,因此呈现暗

#二十三,模板匹配:模板匹配的示例

#####1. 模板匹配是用来在一副大图中搜寻查找模版图像位置的方法。

#####2. cv2.matchTemplate():

  • 第一个参数image:待搜索的图像
  • 第二个参数templ:模板图像
  • 第三个参数result:比较结果的映射图像,其必须为单通道,32位浮点型图像,如果原图(待搜索图像)尺寸为WH,而temple尺寸为wh,则result尺寸一定是(W-w+1)*(H-h+1)
  • 第四个参数method:计算匹配程度的方法
  • CV _ TM _ SQDIFF:平方差匹配法:该方法采用平方差来进行匹配;最好的匹配值为0;匹配越差,匹配值越大。
  • CV _ TM _ CCORR:相关匹配法:该方法采用乘法操作;数值越大表明匹配程度越好。
  • CV _ TM _ CCOEFF:相关系数匹配法:1表示完美的匹配;-1表示最差的匹配。
  • CV _ TM _ SQDIFF _ NORMED:归一化平方差匹配法
  • CV _ TM _ CCORR _ NORMED:归一化相关匹配法
  • CV _ TM _ CCOEFF _ NORMED:归一化相关系数匹配法

#####3. cv2.minMaxLoc():函数功能:假设有一个矩阵a,现在需要求这个矩阵的最小值,最大值,并得到最大值,最小值的索引。咋一看感觉很复杂,但使用这个cv2.minMaxLoc()函数就可全部解决。函数返回的四个值就是上述所要得到的。

  • 第一个参数src:输入矩阵
  • 第二个参数mask:用于选择子数组的可选掩码
  • 返回值:输入矩阵的最小值,最大值,并得到最小值,最大值的索引值

#二十四,Hough变换

#####1. cv2.HoughLines():

  • 第一个参数image:输入图像,且必须是二值图像,在进行霍夫变换之前需要采用阈值方法的边缘jiance
  • 第二,三个参数:分别是r,0对应的精度
  • 第四个参数
  • threshold:阈值,判定为直线投票数的最小值,投票数取决于直线上点的个数,因此这个阈值代表了检测到的直线的最短长度
  • 返回(ρ, θ)值的序列,ρ单位像素,θ单位弧度。

#####2. cv2.HoughLinesP():

  • 第一个参数image:输入图像,且必须是二值图像,在进行霍夫变换之前需要采用阈值方法的边缘jiance
  • 第二,三个参数:分别是r,0对应的精度
  • 第四个参数threshold:阈值,判定为直线投票数的最小值,投票数取决于直线上点的个数,因此这个阈值代表了检测到的直线的最短长度
  • 第五个参数minLineLengh:线的最短长度。比这个短的线都会被忽略
  • 第六个参数MaxLineGap:两条线段之间的最大间隔,如果小于此值,这两条直线就被看成是一条直线
  • 返回值:直线的起点和终点

#####3. cv2.HoughCircles():

  • 第一个参数image:输入8位图像(灰度图)
  • 第二个参数method:cv2.HOUGH _ GRADIENT
  • 第三个参数dp:寻找圆弧圆心的累计分辨率,这个参数允许创建一个比输入图像分辨率低的累加器。(这样做是因为有理由认为图像中存在的圆会自然降低到与图像宽高相同数量的范畴)。如果dp设置为1,则分辨率是相同的;如果设置为更大的值(比如2),累加器的分辨率受此影响会变小(此情况下为一半)。dp的值不能比1小。
  • 第四个参数min_dist:该参数是让算法能明显区分的两个不同圆之间的最小距离。
  • 第五个参数param1:用于Canny的边缘阀值上限,下限被置为上限的一半。
  • 第六个参数param2::累加器的阀值。
  • 第七个参数min_radius:最小圆半径
  • 第八个参数max_radius:最大圆半径

#二十五,分水岭图像分割:分水岭图像分割代码示例

#####1. 距离变换的基本含义是计算一个图像中非零像素点到最近的零像素点的距离,也就是到零像素点的最短距离个最常见的距离变换算法就是通过连续的腐蚀操作来实现,腐蚀操作的停止条件是所有前景像素都被完全腐蚀。这样根据腐蚀的先后顺序,我们就得到各个前景像素点到前景中心呗Ⅵ像素点的距离。根据各个像素点的距离值,设置为不同的灰度值。这样就完成了二值图像的距离变换

#####2. cv2.distanceTransform():

  • 第一个参数src:8位单通道(二进制)源图像
  • 第二个参数distanceType:距离类型:0,1,2 分别表示 CV _ DIST _ L1, CV _ DIST _ L2 , CV _ DIST _ C
  • 第三个参数maskSize:距离变换蒙版的大小。它可以是3、5或CV _ DIST _ MASK _ PRECISE(仅第一个功能支持后一个选项)。在CV _ DIST _ L1或CV _ DIST _ C距离类型的情况下,该参数被强制为3,因为3×3的掩码得到的结果与5×5或更大的光圈相同

#####3. cv2.connectedComponents():该函数用以计算二值图像的连通域标记图像

  • 第一个参数image:输入8位单通道二值图像;
  • 第二个参数labels:标记的目标图像
  • 第三个参数connectivity:4连通或8连通
  • 第四个参数Itype:输出图像的标记类型,当前只支持CV _ 32U和CV _ 16U
  • 第五个参数ccltype:标记连通域的算法类型

#####4. cv2.watershed():函数详解

  • 第一个参数Image:输入8位3通道的图像
  • 第二个参数markers:在执行分水岭函数watershed之前,必须对第二个参数markers进行处理,它应该包含不同区域的轮廓,每个轮廓有一个自己唯一的编号,轮廓的定位可以通过Opencv中findContours方法实现,这个是执行分水岭之前的要求。

#二十六,视频分析

#####1. cv2.meanShift():框的大小限定

  • 第一个参数probImage: 概率分布图像,也就是ROI色调直方图的反向投影
  • 第二个参数window: 初始搜索窗口,就是定义ROI的rect
  • 第三个参数criteria: 确定窗口搜索停止的准则,迭代次数达到设置的最大值;窗口中心的漂移值小于某个设定的限值。

#####2.cv2.CamShift():返回的结果是一个带旋转角度的矩形,框的大小随跟踪物体变化而变化

  • 第一个参数probImage: 概率分布图像,也就是ROI色调直方图的反向投影
  • 第二个参数window: 初始搜索窗口,就是定义ROI的rect
  • 第三个参数criteria: 确定窗口搜索停止的准则,迭代次数达到设置的最大值;窗口中心的漂移值小于某个设定的限值。

#####3.背景减除函数: 构造高斯混合模型,从而进行背景减除;
#####cv2.createBackgroundSubtractorMOG():
#####cv2.createBackgroundSubtractorMOG2():
#####cv2.createBackgroundSubtractorGMG():

  • 背景减除详解及代码示例

#二十七,图像去噪(非局部去噪)

#####1. cv2.fastNIMeanDenoising():使用对象为灰度图

  • 第一个参数src:输入图像
  • 第二个参数dst:输出与src具有相同大小和类型的图像
    • 第三个参数h:调节过滤强度的参数(取10效果不错)。
  • 第四个参数 hForColorComponents:与 h 相同,但使用与彩色图像。(与 h 相同,10)
  • 第五参数templateWindowSize:模板补丁的大小(以像素为单位)(推荐值为7)。
  • 第六个参数searchWindowSize:窗口的大小,以像素为单位。(推荐值为 21)

#####2.cv2.fastNlMeansDenoisingColored():使用对象为彩色图

  • 使用参数与上点相同

#####3.cv2.fastNlMeansDenoisingMulti() 适用于短时间的图像序列(灰度图像)

  • 第一个参数是一个噪声帧的列表
  • 第二个参数 imgtoDenoiseIndex 设定那些帧需要去噪,我们可以传入一个帧的索引
  • 第三个参数 temporaWindowSize 可以设置用于去噪的相邻帧的数目,它应该是一个奇数

#####4. cv2.fastNlMeansDenoisingColoredMulti() 适用于短时间的图像序列(彩色图像)
-使用的参数与第一点相同

#二十八,图像修补

#####1.cv2.inpaint():

  • 第一个参数src:输入8位1通道或3通道图像
  • 第二个参数inpaintMask:修复掩码,8位1通道图像。非零像素表示需要修复的区域。
  • 第三个参数dst:输出与src具有相同大小和类型的图像。
  • 第四个参数inpaintRadius:算法考虑的每个点的圆形邻域的半径。
  • 第五个参数flags:
  1. INPAINT_NS基于Navier-Stokes的方法;
  2. Alexandru Telea的INPAINT_TELEA方法

你可能感兴趣的:(Pyhon-OpenCV)