OpenCV图像处理笔记[07]

38. 图像轮廓

  • 轮廓

    • 边缘检测能够测出边缘,但是边缘是不连续的。

    • 将边缘连接为一个整体,构成轮廓。

  • 注意

    • 对象是二值图像。所以需要预先进行阈值分割或者边缘检测处理。

    • 查找轮廓需要更改原始图像。因此,通常使用原始图像的一份拷贝操作。

    • 在OpenCV中,是从黑色背景中查找白色对象。因此,对象必须是白色的,背景必须是黑色的。

  • 使用函数

    • cv2.findContours( )

    • cv2.drawContours( )

查找图像轮廓的函数是cv2.findContours( ),通过cv2.drawContours( )将查找到的轮廓绘制到图像上。

  • cv2.findContours()

​ image, contours, hierarchy=cv2.findContours(image,mode,method)

  • 参数

    • mage ,修改后的原始图像
    • contours , 轮廓
    • hierarchy , 图像的拓扑信息(轮廓层次)
    • image , 原始图像
    • ​ mode , 轮廓检索模式
    • method , 轮廓的近似方法
    • mode, 轮廓检索模式
      • cv2.RETREXTERNAL : 表示只检测外轮廓
      • cv2.RETRLIST :检测的轮廓不建立等级关系
      • cv2.RETRCCOMP :建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
      • cv2.RETRTREE :建立一个等级树结构的轮廓。
    • method,轮廓的近似方法

      • cv.CHAINAPPROXNONE :到存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max ( abs(×1一×2, abs( y2 - y1 ))== 1

      • cv2.CHAIN-APPROX_SIMPLE : 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息

      • cv2℃HAINAPPROXTC89Ll : 使用teh-ChinIchain近似算法

      • cv2℃HAINAPPROXTC89KCOS : 使用teh-ChinIchain近似算法

  • cv2.drawContours( )

    ​ r=cv2.drawContours(),contours,contourldx,color[,thickness])

    • r : 目标图像,直接修改目标的像素点,实现绘制。

    • o : 原始图像

    • contours : 需要绘制的边缘数组。

    • contourldx : 需要绘制的边缘索引,如果全部绘制则为一1。

    • color : 绘制的颜色,为BGR格式的Scalar。

    • thickness : 可选,绘制的密度,即描绘轮廓时所用的画笔粗细。

39. 直方图

  • 普通直方图

    • 横坐标: 图像中各个像素点的灰度级(0~255,每一个就是一个灰度级)
    • 纵坐标: 具有该灰度级的像素个数
  • 归一化直方图

    • 横坐标: 图像中各个像素点的灰度级
    • 纵坐标: 出现这个灰度级的概率

DIMS: 使用参数的数量

​ dism = 1

BINS: 参数子集的数目

​ [0, 255] = [0, 15]U[16,31]U……U[240,255]

​ 范围 = bin1 U bin2 U ... U bin16

RANGE: 统计灰度值的范围,一般为[0,255]

​ 最小值: 0, 黑色

​ 最大值: 255, 白色

40. 绘制直方图

  • matplotlib

    • pyplot: 提供了类似于matlab的绘图框架
    • matplotlib.pyplot
    • import matplotlib.pyplot as plt
  • 函数ravel (把二维图像处理成一维数据)

    • hist( 数据源, 像素级)
      • 数据源:图像,必须是一维数组
      • 像素级:一般是256,指[0,255]

41. 使用OpenCV统计直方图

  • 横坐标: [0, 255]

  • 纵坐标: 各个灰度级的像素个数

    [N0, N1, N2, …… N254, N255, ]

  • 函数calcHist

    • 一般形式: hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)

      • hist: 直方图 (返回的直方图,是一个二维数组)
      • images: 原始图像
      • channels: 指定通道
        • 通道编号需要用中括号括起来;
        • 输入图像是灰度图时,它的值是[0];
        • 彩色图像可以是[0], [1], [2] 分别对应通道 B, G, R
      • mask: 掩码图像
        • 统计整幅图像的直方图, 设为None
        • 统计图像某一部分的直方图时,需要掩码图像
      • histSize: BINS的数量
        • 需要用中括号括起来
      • ranges: 现估值范围RANGES
      • accumulate: 累计标识(可选参数)
        • 默认值为false
        • 如果被设置为ture, 则直方图在开始分配时就不会被清零。
        • 该参数允许从多个对象中算计单个直方图, 或者用于实时更新直方图
        • 多个直方图的累积结果,用于对一组图像计算直方图。

      例:hist = cv2.calcHist([img],[0],None,[256],[0,255]

42. 绘制OpenCV统计直方图

​ 使用matplotlib 中的pyplot包

​ import matplotlib.pyplot as plt

​ x = [1,2,3,4,5,6]

​ y = [0.3,0.4,2,5.3,4.5,4]

​ plt.plot(x,y)

histb = cv2.calcHist([o].[0],None,[256],[0,256])

​ plt.plot(histb,color='b')

43. 使用掩膜的直方图

  • 一般形式: hist = cv2.calcHist(images, channels, mask, histSize, ranges)
    • hist: 直方图 (返回的直方图,是一个二维数组)
    • images: 原始图像
    • channels: 指定通道
      • 通道编号需要用中括号括起来;
      • 输入图像是灰度图时,它的值是[0];
      • 彩色图像可以是[0], [1], [2] 分别对应通道 B, G, R
    • mask: 掩码图像
      • 统计整幅图像的直方图, 设为None
      • 统计图像某一部分的直方图时,需要掩码图像
    • histSize: BINS的数量
      • 需要用中括号括起来
    • ranges: 现估值范围RANGES
    • accumulate: 累计标识(可选参数)

44. 掩膜原理及演示

  • 或(or) : 并联 与(and) : 串联

    mask = np.zeros(800, np.unit8)

    mask[300: 500, 300,500] = 255

    生成掩膜图形

    ​ 计算结果 = cv2.bitwise_and(图像1, 图像2)

    masked_img = cv2.bitwise_and(img, mask)

posted @ 2022-08-03 11:06  Hecto  阅读(64)  评论(0)    收藏  举报