凸形状内部的任意两点的连线都应该在形状里面。

1 道格拉斯-普克算法 Douglas-Peucker algorithm

这个算法在其他文章中讲述的非常详细,此处就详细撰述。

下图是引用维基百科的。ε称之为阈值 shreshold

图一

静态图如下:

具体详细的可以参考如下两篇文章。

相关文章如下:

道格拉斯-普克 抽稀算法 附javascript实现,该文章只看他的文字讲解就好,他的代码不是通过python实现的。

2 实现函数 cv2.approxPloyDP

作用:对目标图像进行(按指定精度、阈值,两者是一个概念)进行近似多边形曲线拟合。

使用一个较少顶点的曲线/多边形去拟合一个顶点较多的曲线/多边形,两曲线/多边形间的距离小于或等于某一指定精度/阈值

cv2.approxPolyDP(curve, epsilon, closed) -> approxCurve

参数:

curve - 2D点矢量,为图像的 “ 轮廓 ” 值。

epsilon - 指定近似精度的参数ε,这是原始曲线与其近似值之间的最大距离。参数越小,两直线越接近

closed - 若为true,曲线第一个点与最后一个点连接形成闭合曲线,若为false,曲线不闭合。

返回值:

approxCurve - 曲线/多边形近似结果。

备注:

为什么已经有了一个能够精确表示的轮廓 2D点矢量,却还需要得到一个近似多边形呢?

这主要是近似得到的多边形是由一组直线构成的,故能够在一个区域内定义多边形,以便后续的操作和处理,该项操作在许多计算机视觉任务中非常重要。

代码示例:

#epsilon 为近似度参数,该值需要轮廓的周长信息#多边形周长与源轮廓周长之比就是epsilon

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

approx=cv2.approxPolyDP(cnt, epsilon, True)#approx 为列表list,若approx为元组,则需要将其转换成列表list#为了安全起见,可将[approx]作为参数传入函数

cv2.drawContours(img, [approx], -1, (255, 255, 0), 2)

运行:

当 epsilon 的取值不同时,会存在不同的拟合程度。

3 凸包convexHull

作用:找到2D点集的凸包

cv2.convexHull(points[, clockwise[, returnPoints]]]) -> hull

参数:

points - 2D点集 2D point set

clockwise - 布尔类型,默认false;若为true,输出的凸包则为顺时针方向;若为false,输出的凸包则为逆时针方向。注意:这里的坐标系是x轴方向指向右侧,y轴方向指向上方。

returnPoints - 布尔类型,默认true,在矩阵情况下,若为true,则返回凸包点集;若为false,则返回整数向量的索引

返回值:

hull - 输出的凸包,是整数向量的索引(an integer vector of indices)或点集向量(vector of points)

代码示例:

hull = cv2.convexHull(cnt)

运行:

4 代码综合

4.1 保留原始图像

将上述代码进行综合,示例如下

importcv2importnumpy as np

img= cv2.imread('Mjolnir.jpg')

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

ret, binary= cv2.threshold(gray,127,255,cv2.THRESH_BINARY)

contours, hierarchy=cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)for cnt incontours:#----源轮廓-------

cv2.drawContours(img, [cnt], -1, (0, 255, 0), 2)#近似多边形

#epsilon 为近似度参数,该值需要轮廓的周长信息

#多边形周长与源轮廓周长之比就是epsilon

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

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

cv2.drawContours(img, [approx],-1, (255, 255, 0), 2)#凸包

hull =cv2.convexHull(cnt)

cv2.drawContours(img, [hull],-1, (0, 0, 255), 2)

cv2.imshow("approx",img)

cv2.waitKey(0)

cv2.destroyAllWindows()

运行

4.2 在新建幕布上绘制轮廓

当然在书(OpenCV 3 计算机视觉)第三章 3.10 凸轮廓与Douglas-Peucker算法 中,是将三个轮廓放在了黑色图像上。

实现代码如下:

importcv2importnumpy as np

img= cv2.imread('Mjolnir.jpg')

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

ret, binary= cv2.threshold(gray,127,255,cv2.THRESH_BINARY)

contours, hierarchy=cv2.findContours(binary,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)#生成黑色"幕布"

black = cv2.cvtColor(np.zeros((img.shape[1], img.shape[0]), dtype=np.uint8), cv2.COLOR_GRAY2BGR)for cnt incontours:#----源轮廓-------

cv2.drawContours(black, [cnt], -1, (0, 255, 0), 2)#近似多边形

#epsilon 为近似度参数,该值需要轮廓的周长信息

#多边形周长与源轮廓周长之比就是epsilon

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

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

cv2.drawContours(black, [approx],-1, (255, 255, 0), 2)#凸包

hull =cv2.convexHull(cnt)

cv2.drawContours(black, [hull],-1, (0, 0, 255), 2)

cv2.imshow("approx",black)

cv2.waitKey(0)

cv2.destroyAllWindows()

运行

参考:

Convex Hull 这个粉红色的,是不是萌妹版

道格拉斯算法 matlab,OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数...相关推荐

  1. OpenCV 学习笔记03 凸包convexHull、道格拉斯-普克算法Douglas-Peucker algorithm、approxPloyDP 函数...

    凸形状内部的任意两点的连线都应该在形状里面. 1 道格拉斯-普克算法 Douglas-Peucker algorithm 这个算法在其他文章中讲述的非常详细,此处就详细撰述. 下图是引用维基百科的.ε ...

  2. 分水岭算法java,OpenCV 学习笔记 04 深度估计与分割——GrabCut算法与分水岭算法...

    1 使用普通摄像头进行深度估计 1.1 深度估计原理 这里会用到几何学中的极几何(Epipolar Geometry),它属于立体视觉(stereo vision)几何学,立体视觉是计算机视觉的一个分 ...

  3. OpenCV 学习笔记03 boundingRect、minAreaRect、minEnclosingCircle、boxPoints、int0、circle、rectangle函数的用法...

    函数中的代码是部分代码,详细代码在最后 1 cv2.boundingRect 作用:矩形边框(boundingRect),用于计算图像一系列点的外部矩形边界. cv2.boundingRect(arr ...

  4. OpenCV学习笔记(二十六)——小试SVM算法ml OpenCV学习笔记(二十七)——基于级联分类器的目标检测objdect OpenCV学习笔记(二十八)——光流法对运动目标跟踪Video Ope

    OpenCV学习笔记(二十六)--小试SVM算法ml 总感觉自己停留在码农的初级阶段,要想更上一层,就得静下心来,好好研究一下算法的东西.OpenCV作为一个计算机视觉的开源库,肯定不会只停留在数字图 ...

  5. 《算法图解》学习笔记(十):K 最近邻算法(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  6. 《算法图解》学习笔记(七):狄克斯特拉算法(附代码)

    欢迎关注WX公众号:[程序员管小亮] python学习之路 - 从入门到精通到大师 文章目录 欢迎关注WX公众号:[程序员管小亮] [python学习之路 - 从入门到精通到大师](https://b ...

  7. openCV学习笔记(十二) —— 人脸识别算法(1/3)—— 特征脸 EigenFaces

    一.原理 opencv支持3种人脸识别的算法,分别是: 1.    Eigen Faces    PCA(特征脸方法) 2.    Fisher Faces    LDA(线性判别分析) 3.     ...

  8. brisk matlab,opencv学习笔记三十七:BRISK特征点检测与匹配

    简介 BRISK算法是2011年ICCV上<BRISK:Binary Robust Invariant Scalable Keypoints>文章中,提出来的一种特征提取算法,也是一种二进 ...

  9. OpenCV学习笔记03:缩放裁剪图像与调整图像色调

    文章目录 一.缩放裁剪图像 (一)resize函数 (二)缩放图像 1.编写程序,实现功能 2.运行程序,查看结果 (三)裁剪图像 1.编写程序,实现功能 2.运行程序,查看结果 二.调整图像色调 ( ...

最新文章

  1. 工程大小优化之图片资源
  2. 【 数字信号处理 】定点数的表示之定点数的字长问题
  3. javascript的正则表达式
  4. 移动APP开发中8大安全问题
  5. ZOJ 1610 Count the Colors 【线段树】
  6. 防屏蔽浏览器_彻底解决安卓手机通知管理难题,顺便还实现了聊天消息防撤回!...
  7. irms模拟数据生成及数据分析
  8. 第三次学JAVA再学不好就吃翔(part116)--同步代码块
  9. 记住:永远不要在MySQL中使用“utf8”,请使用“utf8mb4” 程序员
  10. SHELL常见的系统变量解析
  11. Spring Boot 启动类真的是XXApplication?
  12. LINUX编译GtkLP(开源的打印机图形化工具)
  13. AE的QuickTime问题
  14. destoon 中国银联在线支付接口修改
  15. dell屏幕亮度调节不了_戴尔笔记本无法调节亮度怎么办?如何找回调节亮度?
  16. vue3使用datav
  17. JavaScript期末大作业:基于HTML+CSS+JavaScript黑色的bootstrap响应式企业博客介绍模板
  18. UML建模——活动图(Activity Diagram)
  19. 全球注意力缺陷多动障碍(ADHD)市场规模2021年大约为796亿元(人民币),预计2028年将达到1259亿元
  20. 基于51单片机的数字气压计

热门文章

  1. 通过jquery js 实现幻灯片切换轮播效果
  2. 铣扁机的常用加工方法及构造原理
  3. 产教融合 |贵州轻工职业技术学院一行莅临我司调研交流
  4. webstorm一直index
  5. 福晟集团积极打造高品质社区开启幸福生活
  6. Redis实现发布和订阅
  7. python消费datahub_协同消费_开发指南_DataHub - 阿里云
  8. 【项目实战】Java 开发 Kafka 生产者
  9. 萌新SQL基础学习1
  10. write complete waits等待事件