利用 OpenCV 寻找物体轮廓及表型量
OpenCV(python) 找二值图像的轮廓。轮廓是一系列相连的点组成的曲线,代表了物体的基本外形。轮廓是连续的,边缘并不全都图边缘包括轮廓。在 OpenCV 中其实边缘主要是作为图像的特征使用,比如可以用边缘特征可以区分脸和手,而轮廓主要用来分析物体的形态,比如物体的周长和面轮廓。
加载图像
python
1 | img_url = "https://github.com/xujinzh/archive/blob/master/images/opencv/9.png?raw=true" |
python
1 | import cv2 |
python
1 | response = requests.get(img_url, stream=True) |
(225, 224, 3)
转化为二值图像
python
1 | img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) |
python
1 | # 只取 0, 255 |
{0, 255}
find Contours
python
1 | contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) |
python
1 | len(contours) |
2
python
1 | len(hierarchy), type(hierarchy) |
(1, numpy.ndarray)
python
1 | hierarchy |
array([[[-1, -1, 1, -1],
[-1, -1, -1, 0]]], dtype=int32)
python
1 | for cnt in contours: |
<class 'numpy.ndarray'>
<class 'numpy.ndarray'>
画 contours
python
1 | # 把所有轮廓画在一起 |
python
1 | # 分别画每个轮廓 |
计算轮廓面积
python
1 | for cnt in contours: |
10624.0
3585.5
计算周长
python
1 | for cnt in contours: |
530.6173120737076
239.17871356010437
计算矩
python
1 | for cnt in contours: |
{'m00': 10624.0, 'm10': 1179807.0, 'm01': 988628.0, 'm20': 138264122.0, 'm11': 110420621.75, 'm02': 108261792.33333333, 'm30': 16915839222.900002, 'm21': 12973061316.9, 'm12': 12258148255.633333, 'm03': 13524838384.2, 'mu20': 7245244.246893823, 'mu11': 632384.2880270928, 'mu02': 16263926.89809236, 'mu30': -47729935.87674332, 'mu21': -33712518.19269228, 'mu12': 117861541.09828925, 'mu03': 423503079.8199959, 'nu20': 0.06419140872094325, 'nu11': 0.005602797768874818, 'nu02': 0.1440951254846342, 'nu30': -0.00410270882762122, 'nu21': -0.0028978175530693143, 'nu12': 0.01013099171869212, 'nu03': 0.036402936483911824}
111.05111069277109 93.05609939759036
{'m00': 3585.5, 'm10': 387701.3333333333, 'm01': 283841.5, 'm20': 43129861.08333333, 'm11': 30132658.208333332, 'm02': 23606262.25, 'm30': 4925989623.3, 'm21': 3294219072.0333333, 'm12': 2462194527.1, 'm03': 2049563404.8500001, 'mu20': 1207584.171202682, 'mu11': -559219.6344593987, 'mu02': 1136314.6493166909, 'mu30': 1190115.5424232483, 'mu21': 836261.0243297517, 'mu12': -1818823.7834247053, 'mu03': 894210.7344172001, 'nu20': 0.0939329492050244, 'nu11': -0.04349936904672335, 'nu02': 0.0883891895741609, 'nu30': 0.0015460189391694732, 'nu21': 0.0010863444225512572, 'nu12': -0.0023627420329802268, 'nu03': 0.0011616239614875813}
108.13033979454283 79.1637149630456
轮廓外接矩形
python
1 | for cnt in contours: |
轮廓外接圆
python
1 | for cnt in contours: |
轮廓拟合椭圆
python
1 | for cnt in contours: |
轮廓匹配度
python
1 | cv2.matchShapes(contours[0], contours[1], 1, 0.0) |
0.2869094336215315
参考文献
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 J. Xu!
评论