一、效果图:

在左图的白色区域周围,画任意形状的凸包图。

二、代码

import cv2

import numpy as np

def generate_poly(image, n, area_thresh):

"""

随机生成凸包

:param image: 二值图

:param n: 顶点个数

:param area_thresh: 删除小于此面积阈值的凸包

:return: 凸包图

"""

row, col = np.where(image[:, :, 0] == 255) # 行,列

point_set = np.zeros((n, 1, 2), dtype=int)

for j in range(n):

index = np.random.randint(0, len(row))

point_set[j, 0, 0] = col[index]

point_set[j, 0, 1] = row[index]

hull = []

hull.append(cv2.convexHull(point_set, False))

drawing_board = np.zeros(image.shape, dtype=np.uint8)

cv2.drawContours(drawing_board, hull, -1, (255, 255, 255), -1)

cv2.namedWindow('drawing_board', 0), cv2.imshow('drawing_board', drawing_board), cv2.waitKey()

# 如果生成面积过小,重新生成

if cv2.contourArea(hull[0]) < area_thresh:

drawing_board = generate_poly(image, n, area_thresh)

# 如果生成洞,重新生成

is_hole = image[drawing_board == 255] == 255

if is_hole.all() == True: # 洞,则drawing_board所有为255的地方,image也是255,all()即为所有位置

drawing_board = generate_poly(image, n, area_thresh)

return drawing_board

img = np.zeros((256, 256, 3), np.uint8)

cv2.circle(img, (100, 100), 50, (255, 255, 255), -1)

cv2.namedWindow('img', 0), cv2.imshow('img', img), cv2.waitKey()

img_hull = generate_poly(img, 8, 100)

cv2.namedWindow('img_hull', 0), cv2.imshow('img_hull', img_hull), cv2.waitKey()

补充知识:opencv python 轮廓特征/凸包/外接矩形/外接圆/拟合矩形/拟合直线/拟合圆

Contour Features

1 图像的矩

cv2.moments()

图像的矩可以帮助计算物体的某些特征,如对象的质心,对象的区域等.

代码:

import cv2

import numpy as np

img = cv2.imread('img7.png',0)

ret,thresh = cv2.threshold(img,127,255,0)

im2,contours,hierarchy = cv2.findContours(thresh, 1, 2)

cnt = contours[0]

M = cv2.moments(cnt)

print( M )

输出:

{'m00': 283.0, 'm10': 8260.666666666666, 'm01': 34747.666666666664, 'm20': 251349.8333333333, 'm11': 1008063.0, 'm02': 4274513.166666666, 'm30': 7941981.4, 'm21': 30484543.9, 'm12': 123258620.46666667, 'm03': 526819846.70000005, 'mu20': 10223.989595602674, 'mu11': -6208.702394974302, 'mu02': 8080.874165684916, 'mu30': 8302.495426246896, 'mu21': -14552.154961312423, 'mu12': 11791.528133469663, 'mu03': -3268.923251092434, 'nu20': 0.12765785058625623, 'nu11': -0.07752253611575, 'nu02': 0.10089867729257346, 'nu30': 0.006162296011483629, 'nu21': -0.010800931752771139, 'nu12': 0.008751933371317017, 'nu03': -0.0024262672459139235}

此刻,可以提取有用的数据,如面积,质心等.

质心由关系给出:

cx = int(M['m10']/M['m00'])

cy = int(M['m01']/M['m00'])

2轮廓面积

cv2.contourArea(contour[, oriented])

3轮廓周长

cv2.arcLength(curve, closed)

第二个参数指定形状是否为闭合轮廓

4轮廓近似

它根据我们指定的精度将轮廓形状近似为具有较少顶点数的另一个形状.它是Douglas-Peucker算法的一种实现方式.

cv2.approxPolyDP(curve, epsilon, closed[, approxCurve])

第二个参数epsilon,它是从轮廓到近似轮廓的最大距离.第三个参数指定曲线是否闭合.

下面,在第二幅图像中,绿线表示epsilon =弧长的10%的近似曲线. 第三幅图像显示相同的epsilon =弧长的1%.

代码:

import cv2

import numpy as np

img = cv2.imread('img8.png')

cv2.imshow('src',img)

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(imgray, 127, 255, 0)

im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cnt = contours[1]

epsilon = 0.1*cv2.arcLength(cnt,True)

approx = cv2.approxPolyDP(cnt,epsilon,True)

cv2.polylines(img, [approx], True, (0, 0, 255), 2)

cv2.imshow('show',img)

cv2.waitKey()

5凸包

凸包看起来类似轮廓近似,但是它不是(两者在某些情况下可能提供相同的结果).

convexHull(points[, hull[, clockwise[, returnPoints]]]):检查曲线的凸性缺陷并进行修正.

points:传入的轮廓

hull:输出

clockwise:方向标志,如果为True,则顺时针方向输出凸包.

returnPoints:默认情况下为True,然后它返回hull points的坐标; 如果为False,则返回与hull points对应的轮廓点的索引

下面的手形图像. 红线表示手的凸包, 双面箭头标记显示凸起缺陷.

代码:

import cv2

import numpy as np

img = cv2.imread('img8.png')

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(imgray, 127, 255, 0)

im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cnt = contours[1]

hull = cv2.convexHull(cnt)

returnPoints = True,得到以下值:

array([[[192, 135]],

[[ 9, 135]],

[[ 9, 12]],

[[192, 12]]], dtype=int32)

如果想找到凸性缺陷,需要传递returnPoints = False,得到以下结果:

array([[129],

[ 67],

[ 0],

[142]], dtype=int32)

这些是轮廓中相应点的索引,检查第一个值:

cnt[129]

Out[3]: array([[192, 135]], dtype=int32)

与第一个结果相同.

6 检查凸性

cv2.isContourConvex(contour):检查曲线是否凸起

7 外接矩形

7.1 直边外接矩形

它是一个直的矩形,它不考虑对象的旋转。因此,边界矩形的面积不会最小.

cv.boundingRect()

设(x,y)为矩形的左上角坐标,(w,h)为宽度和高度

代码:

import cv2

import numpy as np

img = cv2.imread('img7.png')

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, thresh = cv2.threshold(imgray, 127, 255, 0)

im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

cnt = contours[0]

x,y,w,h = cv2.boundingRect(cnt)

cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

cv2.imshow('show',img)

cv2.waitKey()

7.2 最小外接矩形

cv.minAreaRect返回一个Box2D结构,其中包含以下detals - (center(x,y),(width,height),rotation of rotation)

cv.boxPoints画上述矩形.

代码:

rect = cv2.minAreaRect(cnt)

box = cv2.boxPoints(rect)

box = np.int0(box)

cv2.drawContours(img,[box],0,(0,0,255),2)

8 最小封闭圈

(x,y),radius = cv2.minEnclosingCircle(cnt)

center = (int(x),int(y))

radius = int(radius)

cv2.circle(img,center,radius,(0,255,0),2)

9 拟合椭圆

ellipse = cv2.fitEllipse(cnt)

cv2.ellipse(img,ellipse,(0,255,0),2)

10 拟合直线

rows,cols = img.shape[:2]

[vx,vy,x,y] = cv2.fitLine(cnt, cv2.DIST_L2,0,0.01,0.01)

lefty = int((-x*vy/vx) + y)

righty = int(((cols-x)*vy/vx)+y)

cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

以上这篇python 生成任意形状的凸包图代码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持聚米学院。

matlab 凸包质心算法,python 生成任意形状的凸包图代码相关推荐

  1. matlab 凸包质心算法,求多边形凸包(线性算法)--陈氏凸包算法--Computing the convex hull of a simple polygon(源码)...

    陈氏凸包算法-算法参考:Computing the convex hull of a simple polygon 作者:Chern-Lin Chen 陈氏算法提供了一个线性效率求凸包的算法,本文使用 ...

  2. python生成摸头GIF动态图

    python生成摸头GIF 本篇教程演示了如何使用python的PIL库生成GIF图片 源码已经贴在文中,自行取用 效果演示 运行代码,会让你选择要制作的图片 运行完成后,会在同路径下生成dem.gi ...

  3. 【python】如何用python生成并保存gif动态图

    有时候在展示实验结果的时候,通过一个gif的动态图可以很好进行表现,通过python生成这种gif图的原理实际上就是通过每次生成图像快照,将它们保存下来,然后通过imageio这个库再将他们组合成一个 ...

  4. python生成固定形状的词云图

    首先制作好自己想要的形状图片形状为黑色 背景为白色 如图所示 import matplotlib.pyplot as plt import jieba from wordcloud import wo ...

  5. python生成任意n阶的三对角矩阵

    数学作业要求实现共轭梯度法的算法. 题目中的矩阵A是n=400/500/600的三对角矩阵. 在网上查阅资料未果后,自己解决了. import numpy as npdef generate_matr ...

  6. unity.生成表示地图信息的二维数组_Unity3D 中生成任意形状3D Texture amp; 体积云...

    3d 贴图一般在 Houdini等软件生成,毕竟需要其他软件支持,导入导出预览效率和制作效率都不高 (Houdini也不便宜....别问就是穷...) Unity中只见到过一些3D噪音图的生成,本文提 ...

  7. 十大经典排序算法Python版实现(附动图演示)

    来源:大数据DT 本文约5200字,建议阅读10分钟 排序算法是<数据结构与算法>中最基本的算法之一.本文介绍10种常见的内部排序算法,及如何用Python实现. 排序算法可以分为内部排序 ...

  8. Python 生成、识别社会统一信用代码

    三证合一之后,社会统一信用代码就是企业的身份证.也就是说只要你的程序涉及企业信息的录入,那就少不了社会统一信用代码的录入.这里分享一个工具,可以用 Python 来识别社会统一信用代码,也可以随机生成 ...

  9. 基于TensorFlow的MTCNN人脸检测算法(生成PNet的人脸关键点数据 代码注解)

    代码源自Github:https://github.com/AITTSMD/MTCNN-Tensorflow 该阶段代码取自 Git主 代码目录下 MTCNN-Tensorflow-master / ...

最新文章

  1. 阿里,腾讯,拼多多面试必挂:面对千万级、亿级流量怎么处理?
  2. 掌握 PHP 中的正则表达式 二
  3. gitlab ci 自动化部署_前端gitLab加jenkins自动化构建和部署,以及服务器常用的linux命令行操作,免密登录...
  4. zz eclipse.ini内存设置
  5. vue项目职责_进大厂兼职的机会来了!腾讯微校项目招人了!
  6. iOS申请发布证书-图文详解
  7. linux apache 2.2下载,Apache HTTP Server 2.2.26 发布下载
  8. 【BZOJ3207】花神的嘲讽计划Ⅰ Hash+主席树
  9. 2020-12-28 learning opencv3: 十:Smoothing
  10. 情人节程序员用HTML网页表白【浪漫爱心旋转】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  11. 计算机使用快捷键大全
  12. linux分辨率变低了,解决 ubuntu 装N卡驱动后开机分辨率变低 转
  13. PE启动盘制作,电脑PE工具制作教程(可能是最详细的制作方法)小白推荐
  14. Python学习笔记—— python基础 1. 变量的输出
  15. HTML教程笔记(菜鸟教程)
  16. java 运行配置_JAVA运行环境配置
  17. android 记事本上功能,安卓手机上有多功能记事本app吗?
  18. Json字符串的标准写法
  19. java 1.8下载_jre1.8官方下载-JAVA运行环境(jre8 64位)1.8.0.25 官网最新版【离线版】下载_东坡手机下载...
  20. 显著性检测——GR模型

热门文章

  1. WindbgPreview双机内核调试
  2. Ubuntu安装Chrome/Firefox/360Se等浏览器
  3. SketchUp模型 | iMod · 精选240 —— 现代客餐厅SU模型
  4. iOS开发通过微信学习WCDB(四)
  5. 2022上半年软考电子证书查询已开通
  6. jq命令删除JSON文件中的元素
  7. ora-00257 ORACLE 归档日志满了处理办法
  8. 计算机网络军训口号,计算机专业军训口号
  9. 软件测试工程师自学路径--从基础到精通
  10. 关于“宇宙”可言说的一切