opencv学习之:图像轮廓(找出轮廓、绘出轮廓、近似轮廓、计算轮廓面积、周长)
文章目录图像轮廓轮廓检索模式 modes轮廓逼近方法 methods选取某个轮廓计算轮廓内的面积、周长轮廓近似的方法import cv2import numpy as npimport matplotlib.pyplot as pltimport matplotlib.cm as cdef cv_show(img):cv2.imshow("img",img)cv2.waitKey(0)def cv
·
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as c
def cv_show(img):
cv2.imshow("img",img)
cv2.waitKey(0)
def cv_read(img_file,gray=True):
if gray == True:
return cv2.imread(img_file,0)
else:
return cv2.imread(img_file)
图像轮廓
- 轮廓和边缘是不同的,边缘是零散的,而轮廓是完整的一个整体
轮廓检索模式 modes
- 通常第四个 RETR_TREE 是最常用的
轮廓逼近方法 methods
- 为了更高的精确度,最好使用二值图片
原图使用的是 lena:
'''首先对图片进行二值化!!!作为预处理'''
raw_img = cv2.imread("./img.png")
gray_img = cv2.imread("./img.png",cv2.IMREAD_GRAYSCALE)
ret,thresh = cv2.threshold(gray_img,127,255,cv2.THRESH_BINARY)
cv_show(thresh)
contours, hierachy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
'''这里需要做一个 copy 因为 drawContours 的操作会直接对原图进行改变并保存'''
'''二值化操作的是灰度图,但是轮廓我们画在原图上'''
draw_img = raw_img.copy()
# -1 代表所有轮廓,否则需要指定第几个轮廓, 2 是线条宽度
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show(res)
- 下面使用的原图是:
raw_img = cv2.imread("./shapes.png")
gray_img = cv2.imread("./shapes.png",cv2.IMREAD_GRAYSCALE)
'''执行二值化处理'''
ret,thresh = cv2.threshold(gray_img,127,255,cv2.THRESH_BINARY)
cv_show(thresh)
选取某个轮廓
contours, hierachy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_NONE)
draw_img = raw_img.copy()
# -1 代表所有轮廓,否则需要指定第几个轮廓, 2 是线条宽度
res = cv2.drawContours(draw_img,contours,-1,(0,0,255),2)
cv_show(res)
res = cv2.drawContours(raw_img.copy(),contours,0,(0,0,255),2) # 指定绘制第一个轮廓(三角形的外圈)
cv_show(res)
'''里层外层是两个轮廓'''
计算轮廓内的面积、周长
# 选中一个轮廓,然后进行计算
cnt = contours[0]
cv2.contourArea(cnt)
8500.5
cv2.arcLength(cnt,True) # True 表示闭合
437.9482651948929
轮廓近似的方法
# 首先选出五角星的轮廓展示一下
res = cv2.drawContours(raw_img.copy(),contours,8,(0,0,255),2) # 指定绘制第一个轮廓(三角形的外圈)
cv_show(res)
'''轮廓近似'''
cnt = contours[8] # 使用五角星轮廓做近似操作
alpha = 0.1
# epsilon 代表拿原轮廓周长的 0.1 长度作为轮廓近似的标准,这个值越小轮廓越接近原轮廓,这个值越大,近似的轮廓越概括
epsilon = alpha * cv2.arcLength(cnt,True)
appro = cv2.approxPolyDP(cnt,epsilon,True)
res = cv2.drawContours(raw_img.copy(),[appro],-1,(0,0,255),2)
cv_show(res)
更多推荐
所有评论(0)