OpenCV笔记-对轮廓进行平滑处理
项目背景
有一个像素数较少的图像,在上面找轮廓,显示轮廓锯齿严重;
如何将轮廓进行平滑?
一开始是想着将轮廓上的拐点拟合出一个贝塞尔曲线,由于要绘制回原图像上,且贝塞尔曲线的生成也没有找到很好的办法;
后来又想到可以将图像和轮廓的绘制分为两个图层,将轮廓的绘制图层放大,计算出一个高精度的轮廓线,这样的轮廓线更加平滑,采样更高;然后缩小合并在原图上;
具体实现
主要是用了cv::blur和resize等opencv函数;
1.将图像模糊处理;
2.将图像放大,并进行插值;
3.将图像根据阈值,缩小轮廓范围;
图像模糊
cv::blur(in_mat, out_mat, cv::Size(3, 3));
图像放大
cv::resize(in_mat, out_mat, cv::Size(width*10, height*10), 0, 0, INTER_CUBIC);
查找图像轮廓绘制
将放大图像,找轮廓,在放大图像上绘制轮廓;
vector<vector<Point>>contours;//轮廓
vector<Vec4i>hierachy;//存放轮廓结构变量
cv::findContours(blur_mat, contours, hierachy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE);
drawContours(blur_mat, contours, -1, cv::Scalar(255), 3);imshow("draw contours image", blur_mat);
waitKey();
使用cv::threshold将图像中100-255内的值保留,除去其他值;
cv::threshold(blur_mat, threshold_mat, 100, 255, THRESH_BINARY);
再次基础上,找轮廓并绘制在blur_mat上;
改变cv::threshold内的阈值范围后,可以看到轮廓变大了:
注意:如果使用大的卷积核过度平滑图像数据,会将图像里的像素值降低过多,此时如果仍然使用使用较高的threshold后,轮廓有丢失;
OpenCV笔记-对轮廓进行平滑处理相关推荐
- Opencv 笔记5 边缘处理-canny、sobel、Laplacian、Prewitt
一.边缘检测概述 边缘检测是计算视觉中的基本问题,边缘检测的目的是标识图像中亮度变换明显的点.边缘检测大幅度的减少了图像的数据量(分为两种:灰度图像边缘检测和彩色图像边缘检测),并且剔除了不相关的信息 ...
- OpenCV笔记-图像预处理1
OpenCV笔记 一. 图像预处理 1. 图像显示与存储 1.1 颜色空间 颜色空间(RGB) 加法混色 三通道:RGB 一个像素的颜色值:(b,g,r) 取值范围:[0,255] or [0.0,1 ...
- Python-OpenCV 笔记6 -- 轮廓(Contours)
Python-OpenCV 笔记6 – 轮廓(Contours) 参考文档: https://docs.opencv.org/3.4/dd/d49/tutorial_py_contour_featur ...
- OpenCV 笔记 -- 边缘检测(Sobel、Laplace、Canny)
OpenCV 笔记 – 边缘检测(Sobel.Laplace.Canny) 参考文档 一.Sobel 算子 1.简介 Sobel 算子是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度近似值.在 ...
- OpenCV 中的图像处理 004_平滑图像
本文主要内容来自于 OpenCV-Python 教程 的 OpenCV 中的图像处理 部分,这部分的全部主要内容如下: 改变色彩空间 学习在不同色彩空间之间改变图像.另外学习跟踪视频中的彩色对象. 图 ...
- python+OpenCv笔记(十三):边缘检测——Sobel检测算子
Sobel检测算子 概述: Sobel边缘检测算法比较简单,实际应用中效率比canny边缘检测效率要高,但是边缘不如Canny检测的准确,但是很多实际应用的场合,sobel边缘却是首选,Sobel算子 ...
- OpenCV检测图像轮廓
轮廓只不过是图像中连接的曲线,或者图像中连通部分的边界,轮廓通常以图像中的边缘来计算,但是,边缘和轮廓的区别在于轮廓是闭合的,而边缘可以是任意的.边缘的概念局限于点及其邻域像素,轮廓将目标作为整体进行 ...
- 计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours()介绍
计算机视觉开源库OpenCV之绘制轮廓函数cv2.drawContours(),用于轮廓的绘制或填充. cv2.drawContours(image, contours, contourIdx, co ...
- 计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours()介绍
计算机视觉开源库OpenCV之查找轮廓函数cv2.findContours说明如下: 示例代码: #!/usr/bin/env python3import cv2image = cv2.imread( ...
最新文章
- java im 框架_Netty实战:设计一个IM框架
- ORA-14452的出现原因解析及解决方法
- ajax 省市级联项目中的实现
- C/C++使用openssl进行摘要和加密解密(md5, sha256, des, rsa)
- 华为android系统最新版,谷歌再放大招截胡鸿蒙系统!发布最新版安卓系统:国产手机抢先升级...
- MySQL中的多表插入更新与MS-SQL的对比
- 关于 ASP.NET MVC 中的视图生成
- ILI9341液晶LCD彩色显示原理
- vue请求PHP接口报错provisional headers are shown
- mono linux 运行机制,linux – Mono如何神奇?
- 【python】Python的基本数据类型之运算符
- 知乎问答 | 如何在同一坐标系下绘制多幅图形
- ubuntu服务器上提示 To run a command as administrator (user “root“), use “sudo <command>“. See “ 解决方案
- Python:SQLMap的工作流程
- matlab 绘制三维空间直线
- 标准gpx文件的时间格式
- php有没有ispostback,php用什么表示IsPostBack?
- 各地级市系列环境指标数据(2003-2017年)
- 《模拟电子技术基础》笔记——上交大郑益慧主讲——辅助教材《电子电路原理第四版》—— 要反反复复看直到记住图的推导过程——出错了欢迎指正——由于是快速刷了一遍还是要反复复习——学习这里面的思路
- 网络创业者之家:盘点那些不起眼的赚钱机会,成就了大批年轻人。