书名:计算机视觉40例从入门到深度学习:OpenCV-Python
作者:李立宗
出版社:电子工业出版社
出版时间:2022-07-01
ISBN:9787121436857
- 实践中,经常需要对图像内的对象进行计数,如细胞计数等。
- 通过查找轮廓的方式实现对细胞的计数。
一、轮廓与边缘
- 轮廓与边缘的区别在于,
边缘是不连续的,检测到的边缘并不一定是一个整体;
轮廓是连续的,是一个整体。 - 由于轮廓是连续的,所以能够通过计算轮廓数量的方式,实现图像内的物体计数。
- 需要注意的是,查找轮廓的同时会找到图像内细小斑点等噪声的轮廓。
因此,在计数时,需要去除那些非常小的轮廓,只计算那些相对较大的轮廓。
二、理论基础
1、图像的中心点
-
如何获取图像的中心点呢?
实践中,往往通过图像的矩信息获取其中心点 -
一般采用质心来表示中心点。质心,通常指“质量中心”,在图像密度均匀的情况下,质心与中心点是一样的。
-
轮廓是图像非常重要的一个特征,利用轮廓能够非常方便地获取图像的面积、质心、方向等信息。
借助这些特征和统计信息,能够方便地对图像进行识别。 -
比较两个轮廓最简单的方法是比较二者的轮廓矩。
轮廓矩代表了一个轮廓、一幅图像、一组点集的全局特征。
矩信息包含了对应对象不同类型的几何特征,如大小、位置、角度、形状等。
矩信息被广泛地应用在模式识别、图像识别等方面。
2、获取图像的中心点
- OpenCV提供了函数cv2.moments()来获取图像的矩特征,使用该函数能够非常方便地获取图像的质心(中心点)。
三、在一个对象的质点绘制文字说明
import cv2
o = cv2.imread("d:\\cup.jpg",1)
cv2.imshow("original",o)
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)
ret , binary = cv2.threshold(gray , 200 , 255 ,cv2.THRESH_BINARY)
cv2.imshow("binary",binary)
contours , hierarchy = cv2.findContours(binary , cv2.RETR_LIST ,
cv2.CHAIN_APPROX_SIMPLE)
x=cv2.drawContours(o,contours, 1,(0,0,255),3)
m00=cv2.moments(contours[1])['m00']
m10=cv2.moments(contours[1])['m10']
m01=cv2.moments(contours[1])['m01']
cx=int(m10/m00)
cy=int(m01/m00)
cv2.putText(o,"cup", (cx, cy), cv2.FONT_HERSHEY_SIMPLEX,2,(0,0,255),3 )
cv2.imshow("result",o)
cv2.waitKey()
cv2.destroyAllWindows()
网友评论