【人工智能学习之图像操作(五)】

发布于:2024-06-30 ⋅ 阅读:(13) ⋅ 点赞:(0)

【人工智能学习之图像操作(五)】

对象掩码

  • 用于获取构成对象的所有像素点
import cv2
import numpy as np
img = cv2.imread('3.jpg')
imggray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imggray, 127, 255, 0)
_, contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
mask = np.zeros(imggray.shape, np.uint8)
cv2.drawContours(mask, [contours[0]], 0, 255, -1)
pixelpoints = np.transpose(np.nonzero(mask))
print(pixelpoints)
cv2.imshow("mask", mask)
cv2.waitKey(0)
  • 最大值和最小值及它们的位置
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)
  • 使用相同的掩模求一个对象的平均颜色或平均灰度
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(imgray,mask = mask)

形状匹配

  1. 查找图像轮廓:findContours

    • image:参数是寻找轮廓的图像;

    • mode:参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):

      • cv2.RETR_EXTERNAL:表示只检测外轮廓
      • cv2.RETR_LIST:检测的轮廓不建立等级关系
      • cv2.RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
      • cv2.RETR_TREE:建立一个等级树结构的轮廓。
    • method:轮廓的近似办法:

      • cv2.CHAIN_APPROX_NONE:存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
      • cv2.CHAIN_APPROX_SIMPLE:压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
      • cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用teh-Chinl chain 近似算法
    • 返回值:

      • contour:轮廓本身
      • hierarchy:每条轮廓对应的属性,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。
  2. 比较两个形状或轮廓的相似度:cv2.matchShape
    如果返回值越小, 匹配越好。它是根据 Hu 矩来计算的。
    Hu 矩是归一化中心矩的线性组合之所以这样做是为了能够获取 代表图像的某个特征的矩函数这些矩函数对某些变化如缩放 ,旋转,镜像映射( 除了 h1)具有不变形。

    • contour1:第一个轮廓,numpy 数组类型
    • contour2:第二个轮廓,numpy 数组类型
    • method:计算相似度的方法,可以是以下值之一:
      • cv2.CONTOURS_MATCH_I1:使用第一种方法计算相似度
      • cv2.CONTOURS_MATCH_I2:使用第二种方法计算相似度
      • cv2.CONTOURS_MATCH_I3:使用第三种方法计算相似度
    • parameter:方法的参数,现在好像没什么用,可以设为0
import cv2
import numpy as np
img1 = cv2.imread('4.jpg', 0)
img2 = cv2.imread('5.jpg', 0)
ret, thresh = cv2.threshold(img1, 127, 255, 0)
_, contours, hierarchy = cv2.findContours(thresh, 2, 1)
cnt1 = contours[0]
ret, thresh2 = cv2.threshold(img2, 127, 255, 0)
_, contours, hierarchy = cv2.findContours(thresh2, 2, 1)
cnt2 = contours[0]
ret = cv2.matchShapes(cnt1, cnt2, 1, 0.0)
print(ret)