OpenCV图像处理(十五)---图像轮廓特征

2022-06-01 19:14:52 浏览数 (2)

热力学第三定律是热力学的四条基本定律之一,其描述的是热力学系统的熵在温度趋近于绝对零度时趋于定值。而对于完整晶体,这个定值为零。由于这个定律是由瓦尔特·能斯特归纳得出后进行表述,因此又常被称为能斯特定理或能斯特假定。1923年,吉尔伯特·路易斯和梅尔·兰德尔对此一定律重新提出另一种表述。

前言

在上一期的文章中,我们学习了图像的边缘检测知识,了解到边缘检测实际就是检测图像中亮度变化有区别或者较大的地方,实际效果表现为图像中的轮廓检测。今天,我们继续来学习图像的新知识--轮廓特征。

一、检测并绘制轮廓的方法

轮廓检测是图像处理中常用的方法。OpenCV中使用cv2.findContours()函数来查找检测物体的轮廓,一起来看看吧。

1.1 原始图像

(各式各样的形状)

1.2 代码实践

1)首先我们来寻找轮廓,然后将轮廓进行描红

代码语言:javascript复制
# 首先我们来寻找轮廓,然后将轮廓进行描红
import cv2
import numpy as np
img = cv2.imread('binary.jpg')
gray = cv2.cvtColor ( img , cv2.COLOR_BGR2GRAY )
ret , binary = cv2.threshold ( gray , 120 , 255 , cv2.THRESH_BINARY )
cv2.imshow("binary", binary)  
image , contours , hierarchy = cv2.findContours ( binary , cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_SIMPLE )
cv2.drawContours(img,contours,-1,(0,0,255),3)

cv2.imshow("img", img)  
cv2.waitKey(0)

2)将找到的轮廓用外接圆进行框选出来

代码语言:javascript复制
import cv2
import numpy as np
img = cv2.imread('binary.jpg')
gray = cv2.cvtColor ( img , cv2.COLOR_BGR2GRAY )
ret , binary = cv2.threshold ( gray , 120 , 255 , cv2.THRESH_BINARY )
cv2.imshow("binary", binary)  
image , contours , hierarchy = cv2.findContours ( binary , cv2.RETR_EXTERNAL , cv2.CHAIN_APPROX_SIMPLE )

#print(contours[0])
 #以圆形框出找到的轮廓
for i in range(len(contours)):
    (x, y), radius = cv2.minEnclosingCircle(contours[i])
    center = (int(x), int(y))
    radius = int(radius)
    img = cv2.circle(img, center, radius, (0, 255, 0), 2)
    cv2.imshow("img", img)
# 这个函数用于绘制
cv2.drawContours(img,contours,-1,(0,0,255),3)

cv2.imshow("img", img)  
cv2.waitKey(0)

代码分析:需要注意的是cv2.findContours()函数接受的参数为二值图,即黑白的(不是灰度图),所以读取的图像要先转成灰度的,再转成二值图(前期讲述的阈值化操作就是二值图)。

1.3 效果展示

1)首先我们来寻找轮廓,然后将轮廓进行描红

(可以看到,轮廓已经被描红)

2)将找到的轮廓用外接圆进行框选出来

(轮廓已经被外接圆框选,有些地方不太合理哦,后期可以用面积法排除。)

结语

今天的分享结束了,我们主要学习了轮廓检测函数和框选函数,当然框选函数还有矩形等方法,小编的本科毕设就是采用的矩形框选方法哦,感兴趣的同学可以多去了解哦,自行体会各种方法的不同哦,当然轮廓检测有个重要的环节就是要去除不必要的轮廓,通常由面积法,宽高法等等。

编辑:玥怡居士|审核:小圈圈居士

cv2

0 人点赞