OpenCv基础_三
阅读原文时间:2023年07月10日阅读:1

轮廓检测

    上采样,图像变大一倍,矩阵用0填充

img = cv2.imread('1,jpg')
cv_show('img',img)
up = cv2.pyrUp(img)
cv_show('up',up)

下采样,图像缩小一倍 删除矩阵偶数行偶数列

img = cv2.imread('1.jpg')
cv_show('img',img)
down = cv2.pyrDown(img)
cv_show('down',down)

  • 拉普拉斯金字塔

对图像G先down得到G_d,再G_d进行up得到G_d_u,然后对G_d_u先down再up,反复这个过程直到某一点结束

down = cv2.pyrDown(img)
down_up = cv2.pyrUp(down)
l_l = img - down_up
cv_show('l_l',l_l)


  进行轮廓检测 先使图像变成灰度图,再进行二值化处理,再利用cv2.findContours()进行轮廓检测,再利用    cv2.drawContours()画出轮廓

1.cv2.findContours(二值化图像,轮廓检索方式,轮廓近似方式)

    轮廓检索方式:一般使用cv2.RETR_TREE

cv2.RETR_EXTERNAL

只检测外轮廓

cv2.RETR_LIST

检测的轮廓不建立等级关系

cv2.RETR_CCOMP

建立两个等级的轮廓,上面一层为外边界,里面一层为内孔的边界信息

cv2.RETR_TREE

建立一个等级树结构的轮廓

  轮廓近似方式:

cv2.CHAIN_APPROX_NONE

存储所有边界点

cv2.CHAIN_APPROX_SIMPLE

压缩垂直、水平、对角方向,只保留端点

cv2.CHAIN_APPROX_TX89_L1

使用teh-Chini近似算法

cv2.CHAIN_APPROX_TC89_KCOS

使用teh-Chini近似算法

  cv2.findContours在Opencv3里有三个返回值:输入的二值化图像,图像的轮廓,轮廓的层析结构(本身包含两个                          ndarray,每个ndarray对应一个轮廓,每个轮廓有四个属性)

  cv2.findContours在Opencv2、Opencv4里有两个返回值:图像的轮廓,轮廓的层析结构

2.cv2.drawContours(原始图像,轮廓,轮廓的索引(当设置为-1时,绘制所有轮廓),画笔颜色,画笔大小)

cv2.drawContours返回值是绘制轮廓后的图像,注意原图像会变化,如果不想让原图变化的话可以copy一份

img = cv2.imread('TX.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
thresh,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
draw_img = img.copy()
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show('res',res)

  轮廓特征

#轮廓特征
cnt = contours[0]
#面积
a = cv2.contourArea(cnt)
print(a)
#周长 True表闭合
L = cv2.arcLength(cnt,True)
print(L)

  轮廓近似

  cv2.approxPolyDP() 主要功能是把一个连续光滑曲线折线化,对图像轮廓点进行多边形拟合

  参数有3个:

  InputArray curve:输入曲线,数据类型可以为vector

  double epsilon:判断点到相对应的line segment 的距离的阈值。(距离大于此阈值则舍弃,小于此阈值则保留,           epsilon越小,折线的形状越“接近”曲线。)

  bool closed:曲线是否闭合的标志位。

#利用周长做阈值进行轮廓近似
epsilon = 0.02 * cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)


  • 外接矩形

      利用cv2.boundingRec(cnt)返回cnt的外接矩形的左上点坐标和宽w和高h,再利用cv2.rectangle()画出外接矩形

      cv2.rectangle()有五个参数:图像,(x,y)左上角坐标,(x+w,y+h)右下角坐标,画笔颜色,画笔粗细

x,y,w,h = cv2.boundingRect(cnt)
img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,0,255),2)
cv_show('img',img)