找轮廓
contours, hierarchy = cv2.findContours(open, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
获取图像的轮廓信息,一般要先二值化,进行边缘检测,闭运算,开运算之后再调用函数
它返回一个轮廓信息的列表,和一个轮廓层析结构信息
=== cv2.CHAIN_APPROX_NONE,所有的边界点都会被存储
=== cv2.CHAIN_APPROX_SIMPLE 的结果,只有4个点
画轮廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
将得到的轮廓信息在图像上画出来,画在RGB图像上
轮廓的重心
cv2.moments(contours[2]) 得到轮廓的矩
cx = int(M[‘m10’]/M[‘m00’]) # 计算得到轮廓的重心
cy = int(M[‘m01’]/M[‘m00’])
轮廓的面积
cv2.contourArea(contours[3])
轮廓的周长
cv2.arcLength(contours[0], True)
Ture表示轮廓是闭合的
False表示轮廓是打开的曲线
轮廓的最小外接矩形
rect = cv2.minAreaRect(contours[1])
找出轮廓的最小外接矩形 中心点、宽和高、角度
cv2.boxPoints(rect)
获取外接矩形的四个点
轮廓的外接矩形
x, y, w, h = cv2.boundingRect(contours[2])
获取轮廓的左上点的坐标,w,h是轮廓的宽和高
cv2.rectangle(img2, (x, y), (x + w, y + h), (0, 255, 0), 2)
根据坐标和长宽画矩形
轮廓的最小外接圆
(x, y), radius = cv2.minEnclosingCircle(contours[1])
获取轮廓的最小外接圆,返回为圆的圆心坐标,半径
cv2.circle(img, center, radius, (0, 255, 0), 2)
根据圆心和半径画圆
轮廓的外接椭圆
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图像处理(八)