基本概念

如果连接物体A内任意两点的直线段都在A的内部,则称A是凸的。任意物体A的凸壳是包含A的最小凸物体。像素化操作首先需找到二值图像中所有的连通区域,然后用这些区域质心作为这些连通分量的代表,即将一个连通 区域像素化位于区域质心的一个像素。我们总是希望像素化算法能够找到物体的质心来代表该物体,但在实际中,可能由于光照不均等原因导致图像在二值化,物体本身形状发生缺损,像素化算法就无法找到物体真正的质心。此时可适当进行凸壳处理,弥补凹损,算法会找到包含原始形状的最小凸多边形,如下图所示。

        下面介绍一种获得集合A的凸壳C(A)的算法。

为了确保在上述生长过程中凸壳不会大幅度超过凸性所需的最小尺寸,可以限制其生长以便凸壳不会超出初始时包含物体A的最小矩形。

示例演示

实现凸壳算法,用来计算嘴巴的凸壳。完整工程代码。

/**********************************************
功能:3*3结构元素的二值图像的腐蚀
参数:src-输入图像dst-输出图像se-模板
***********************************************/
void  CustomErode(const Mat &src, Mat &dst,int se[3][3])
{if (src.empty()){return;}dst = Mat::zeros(src.size(), src.type());bool match = true; //结构元素是否与局部图像匹配//逐行扫描图像,为防止越界,四周留出一个像素的空边for (int i = 1; i < src.rows - 1; i++){uchar* data = dst.ptr<uchar>(i);for (int j = 1; j < src.cols - 1; j++){match = true;for (int m = 0; m < 3; m++){for (int n = 0; n < 3; n++){if (se[m][n] == -1)//不关心continue;if (se[m][n] == 1) //前景{if (src.at<uchar>(i - 1 + m, j - 1 + n) != 255){match = false;break;}}else if (se[m][n]==0)//背景{if (src.at<uchar>(i - 1 + m, j - 1 + n) != 0){match = false;break;}}else{std::cout << "模板结构元素错误!!!" << std::endl;return;}} //for n} // for mif (match){data[j] = 255;}} // for j} //for i
}/**only process binary image* white is foreground
*/
void Convex(const cv::Mat &src, cv::Mat &dst, bool constrain)
{//four struct elements to compute convexint se1[3][3] = {{1,-1,-1},{1,0,-1},{1,-1,1}};  //弥补右侧的凸缺int se2[3][3] = {{1,1,1},{-1,0,-1},{-1,-1,-1}}; //弥补下侧的凸缺int se3[3][3] = {{-1,-1,1},{-1,0,1},{-1,-1,1}}; //弥补左侧的凸缺int se4[3][3] = {{-1,-1,-1},{-1,0,-1},{1,1,1}}; //弥补上侧的凸缺src.copyTo(dst);//采用第一个结构元素Mat backupsrc1;src.copyTo(backupsrc1);while(true){CustomErode(backupsrc1, dst, se1);bitwise_or(dst, backupsrc1, dst);if(cv::countNonZero(dst - backupsrc1) == 0)break;dst.copyTo(backupsrc1);}//采用第二个结构元素Mat backupsrc2;src.copyTo(backupsrc2);while(true){CustomErode(backupsrc2, dst, se2);bitwise_or(dst, backupsrc2, dst);if(cv::countNonZero(dst - backupsrc2) == 0)break;dst.copyTo(backupsrc2);}//采用第三个结构元素Mat backupsrc3;src.copyTo(backupsrc3);while(true){CustomErode(backupsrc3, dst, se3);bitwise_or(dst, backupsrc3, dst);if(cv::countNonZero(dst - backupsrc3) == 0)break;dst.copyTo(backupsrc3);}//采用第四个结构元素Mat backupsrc4;src.copyTo(backupsrc4);while(true){CustomErode(backupsrc4, dst, se4);bitwise_or(dst, backupsrc4, dst);if(cv::countNonZero(dst - backupsrc4) == 0)break;dst.copyTo(backupsrc4);}dst = Mat::zeros(src.size(), src.type());for(int i = 0; i < src.rows; i++){for(int j = 1; j < src.cols; j++){if(backupsrc1.at<uchar>(i, j) == 255 || backupsrc2.at<uchar>(i, j) == 255 ||backupsrc3.at<uchar>(i, j) == 255 ||backupsrc4.at<uchar>(i, j) == 255)dst.at<uchar>(i, j) = 255;}}//需要限制凸壳的生长//找到原始图像中物体的范围if(constrain){int top = src.rows;int bottom = 0;int left = src.cols;int right = 0;for(int i = 0; i < src.rows; i++){for(int j = 1; j < src.cols; j++){if(src.at<uchar>(i, j) == 0) // backgroundcontinue;if(i < top)top = i;if(i > bottom)bottom = i;if(j < left)left = j;if(j > right)right = j;}}for(int i = 0; i < src.rows; i++){for(int j = 1; j < src.cols; j++){if( i < top ||  i > bottom || j < left || j > right)dst.at<uchar>(i, j) = 0;}}}
}

运行结果

形态学图像处理之凸壳相关推荐

  1. 二值图像--形态学处理4 击中,边界提取,孔洞填充,连通分量提取,凸壳,细化,骨架,形态学重建...

    学习DIP第14天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan,欢迎大家转载,发现博客被某些论坛转载后,图像无法正常显示,无法正常表达本人观点,对此表示很不 ...

  2. 数字图像处理——第九章 形态学图像处理

    数字图像处理--第9章 形态学图像处理 文章目录 数字图像处理--第9章 形态学图像处理 1 基础知识 1.1 形态学图像 1.2 二值图像 2 腐蚀和膨胀 2.1 腐蚀 2.2 膨胀 3 开操作与闭 ...

  3. 数字图像处理(6)——形态学图像处理

    数字图像处理(6)--形态学图像处理 文章目录 数字图像处理(6)--形态学图像处理 1 基本概念 2 二值形态学基本运算 2.1 膨胀(dilation) 2.2 腐蚀(erosion) 2.3 开 ...

  4. 什么叫做形态学图像处理_形态学图像处理

    形态学,即数学形态学(mathematical Morphology),是图像处理中应用最为广泛的技术之一,主要用于从图像中提取对表达和描绘区域形状有意义的图像分量,使后续的识别工作能够抓住目标对象最 ...

  5. 冈萨雷斯《数字图像处理》学习笔记(九)形态学图像处理

    目录 序言 一.集合论基础 1.集合的子集与相等 2.集合的基本运算符 3.集合的反射和平移 二.二值形态学的基本运算 1.腐蚀 2.膨胀 3.膨胀与腐蚀运算的对偶性 3.开运算与闭运算 4.一些基本 ...

  6. 数字图像处理第九章笔记——形态学图像处理

    目录 引言 一.预备知识 1.1 平移与反射 1.2 结构元 二. 腐蚀和膨胀 2.1 腐蚀 2.2 膨胀 2.3 对偶性 2.4 python实现腐蚀和膨胀 三.开操作和闭操作 四. 击中或击不中变 ...

  7. 数字图像处理第九章 形态学图像处理

    形态学图像处理 1 预备知识 1.1 集合理论中的基本概念 1.2 二值图像.集合及逻辑算子 2 膨胀和腐蚀 2.1 膨胀 2.2 腐蚀 3 膨胀与腐蚀的结合 3.1 开操作和闭操作 3.2 击中或击 ...

  8. 数字图像处理——第九章(形态学图像处理)

    参考:https://blog.csdn.net/Dujing2019/article/details/90050755 参考:https://blog.csdn.net/weixin_4190739 ...

  9. 利用OpenCV的convexHull和convexityDefects做凸包(凸壳)检测及凸包(凸壳)的缺陷检测

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 要理解凸包(凸壳)检测,首无要知道什么是凸包(凸 ...

最新文章

  1. 转载:Ajax及 GET、POST 区别
  2. 在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
  3. 重构之美-走在Web标准化设计的路上[振臂一呼:Css, Stop! ]
  4. 五十九、如何求N个数的最大公约数和最小公倍数
  5. Vue项目开发过程中解决跨域问题(vue.config.js结合axios)
  6. 为什么Linux不需要碎片整理?
  7. 百练 01 Charm Bracelet
  8. MySQL查看当前的连接信息
  9. 请大家慎用联想笔记本的NOVO功能
  10. mysql的分类有哪些_MYSQL查询所有的分类,以及每个分类下面所有的文章?
  11. TN3399开发板折腾记录
  12. 联想服务器修改开机密码,联想电脑怎么修改开机密码
  13. 《模式识别》期末考试考题汇总带答案
  14. 解决VMware安装ubuntu16.04后无法全屏的问题
  15. TP6 自定义404,错误提示页面
  16. 得到app文稿导出_得到-app分析
  17. guess在Java中用法_guess的用法
  18. echarts 3D折线图应用
  19. 人工智能、机器学习和深度学习的区别
  20. Gated Mechanism for Attention Based Multi Modal Sentiment Analysis 阅读笔记

热门文章

  1. 2022年最新验证码识别API接口分享
  2. 「架构远景·」TOGAF建模:价值链图
  3. 亚信安全助力安徽合肥公共资源交易中心等保建设
  4. Spring路径匹配器AntPathMatcher
  5. 北京服务业如何税收筹划,享受税收优惠政策
  6. 在鼠标右键上加入使用notepad++编辑
  7. 人民币今日对美元升值 开始实行浮动汇率制
  8. 对搜狗云输入法的胡思乱想
  9. java字符编码问题_JAVA字符编码系列三:Java应用中的编码问题
  10. 有趣的数学问题(非编程题)