opencv-python图像处理(八)

opencv-python图像处理(八)

图像的轮廓

  1. 找轮廓
    contours, hierarchy = cv2.findContours(open, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    获取图像的轮廓信息,一般要先二值化,进行边缘检测,闭运算,开运算之后再调用函数
    它返回一个轮廓信息的列表,和一个轮廓层析结构信息
    === cv2.CHAIN_APPROX_NONE,所有的边界点都会被存储
    === cv2.CHAIN_APPROX_SIMPLE 的结果,只有4个点

  2. 画轮廓
    cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
    将得到的轮廓信息在图像上画出来,画在RGB图像上

  3. 轮廓的重心
    cv2.moments(contours[2]) 得到轮廓的矩
    cx = int(M[‘m10’]/M[‘m00’]) # 计算得到轮廓的重心
    cy = int(M[‘m01’]/M[‘m00’])

  4. 轮廓的面积
    cv2.contourArea(contours[3])

  5. 轮廓的周长
    cv2.arcLength(contours[0], True)
    Ture表示轮廓是闭合的
    False表示轮廓是打开的曲线

  6. 轮廓的最小外接矩形
    rect = cv2.minAreaRect(contours[1])
    找出轮廓的最小外接矩形 中心点、宽和高、角度
    cv2.boxPoints(rect)
    获取外接矩形的四个点

  7. 轮廓的外接矩形
    x, y, w, h = cv2.boundingRect(contours[2])
    获取轮廓的左上点的坐标,w,h是轮廓的宽和高
    cv2.rectangle(img2, (x, y), (x + w, y + h), (0, 255, 0), 2)
    根据坐标和长宽画矩形

  8. 轮廓的最小外接圆
    (x, y), radius = cv2.minEnclosingCircle(contours[1])
    获取轮廓的最小外接圆,返回为圆的圆心坐标,半径
    cv2.circle(img, center, radius, (0, 255, 0), 2)
    根据圆心和半径画圆

  9. 轮廓的外接椭圆
    ellipse = cv2.fitEllipse(contours[1])
    椭圆拟合
    img5 = cv2.ellipse(img2, ellipse, (0, 255, 0), 2)
    画出椭圆

import cv2
import numpy as np

img = cv2.imread('ddd.jpg')
img2 = cv2.imread('ddd.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 转化为灰度图

kernel = np.ones((12, 40), np.uint8)  # 卷积核
edges1 = cv2.Canny(gray, 200, 250)
cv2.imshow('canny', edges1)

ret, thresh = cv2.threshold(edges1, 127, 255, 0)  # 二值化
closing = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)  # 闭运算,先膨胀后腐蚀
open = cv2.morphologyEx(closing, cv2.MORPH_OPEN, kernel)  # 开运算,先腐蚀后膨胀
cv2.imshow('open', open)

contours, hierarchy = cv2.findContours(open, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)  # 找出轮廓
im = cv2.drawContours(img, contours, -1, (0, 255, 0), 3)  # 画轮廓
cv2.imshow('im', im)

M = cv2.moments(contours[2])  # 选取一个轮廓,得出它的矩,返回一个字典
cx = int(M['m10'] / M['m00'])  # 计算得到轮廓的重心
cy = int(M['m01'] / M['m00'])
a = [cx, cy]
print(a)

area = cv2.contourArea(contours[3])  # 计算轮廓的面积
print(area)

long = cv2.arcLength(contours[0], True)  # 计算轮廓的周长
print(long)

rect = cv2.minAreaRect(contours[1])  # 找出最小外接矩形 中心点、宽和高、角度
a = cv2.boxPoints(rect)  # 获取外接矩形的四个点
box = np.int0(a)  # 向下取整
aa = cv2.drawContours(img2, [box], -1, (0, 0, 255), 5)  # 画出轮廓
cv2.imshow('aa', aa)

x, y, w, h = cv2.boundingRect(contours[2])  # 获取轮廓的左上点的坐标,w,h是轮廓的宽和高
img3 = cv2.rectangle(img2, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('bb', img3)

(x, y), radius = cv2.minEnclosingCircle(contours[1])  # 得到轮廓的最小外接圆,返回为圆的圆心坐标,半径
center = (int(x), int(y))
radius = int(radius)
img4 = cv2.circle(img, center, radius, (0, 255, 0), 2)  # 根据圆心和半径画圆
cv2.imshow('cc', img4)

ellipse = cv2.fitEllipse(contours[1])
img5 = cv2.ellipse(img2, ellipse, (0, 255, 0), 2)
cv2.imshow('dd', img5)


while 1:
    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        cv2.destroyAllWindows()
        break



opencv-python图像处理(一)
opencv-python图像处理(二)
opencv-python图像处理(三)
opencv-python图像处理(四)
opencv-python图像处理(五)
opencv-python图像处理(六)
opencv-python图像处理(七)
opencv-python图像处理(八)

你可能感兴趣的:(笔记)