去除小面积(注:输出图像需要初始化,否则会报错)

/*
参数说明:1.输入图像,
2.输出图像(去除掉指定小面积后的图像),
3.需要去除的面积,
4.去除方式(==1去除小连通区域的白色点,==0去除孔洞,黑色点像素)
5.邻域方式:NeihborMode == 1八邻域,NeihborMode == 0四邻域
*/
void RemoveSmallRegion(Mat &Src, Mat &Dst, int AreaLimit, int CheckMode, int NeihborMode)
{int RemoveCount = 0;//新建一幅标签图像初始化为0像素点,为了记录每个像素点检验状态的标签,0代表未检查,1代表正在检查,2代表检查不合格(需要反转颜色),3代表检查合格或不需检查 //初始化的图像全部为0,未检查Mat PointLabel = Mat::zeros(Src.size(), CV_8UC1);if (CheckMode == 1)//去除小连通区域的白色点{//cout << "去除小连通域.";for (int i = 0; i < Src.rows; i++){for (int j = 0; j < Src.cols; j++){if (Src.at<uchar>(i, j) < 10){PointLabel.at<uchar>(i, j) = 3;//将背景黑色点标记为合格,像素为3}}}}else//去除孔洞,黑色点像素{//cout << "去除孔洞";for (int i = 0; i < Src.rows; i++){for (int j = 0; j < Src.cols; j++){if (Src.at<uchar>(i, j) > 10){PointLabel.at<uchar>(i, j) = 3;//如果原图是白色区域,标记为合格,像素为3}}}}vector<Point2i>NeihborPos;//将邻域压进容器NeihborPos.push_back(Point2i(-1, 0));NeihborPos.push_back(Point2i(1, 0));NeihborPos.push_back(Point2i(0, -1));NeihborPos.push_back(Point2i(0, 1));if (NeihborMode == 1){//cout << "Neighbor mode: 8邻域." << endl;NeihborPos.push_back(Point2i(-1, -1));NeihborPos.push_back(Point2i(-1, 1));NeihborPos.push_back(Point2i(1, -1));NeihborPos.push_back(Point2i(1, 1));}//else cout << "Neighbor mode: 4邻域." << endl;int NeihborCount = 4 + 4 * NeihborMode;int CurrX = 0, CurrY = 0;//开始检测for (int i = 0; i < Src.rows; i++){for (int j = 0; j < Src.cols; j++){if (PointLabel.at<uchar>(i, j) == 0)//标签图像像素点为0,表示还未检查的不合格点{   //开始检查vector<Point2i>GrowBuffer;//记录检查像素点的个数GrowBuffer.push_back(Point2i(j, i));PointLabel.at<uchar>(i, j) = 1;//标记为正在检查int CheckResult = 0;for (int z = 0; z < GrowBuffer.size(); z++){for (int q = 0; q < NeihborCount; q++){CurrX = GrowBuffer.at(z).x + NeihborPos.at(q).x;CurrY = GrowBuffer.at(z).y + NeihborPos.at(q).y;if (CurrX >= 0 && CurrX < Src.cols&&CurrY >= 0 && CurrY < Src.rows)  //防止越界  {if (PointLabel.at<uchar>(CurrY, CurrX) == 0){GrowBuffer.push_back(Point2i(CurrX, CurrY));  //邻域点加入buffer  PointLabel.at<uchar>(CurrY, CurrX) = 1;           //更新邻域点的检查标签,避免重复检查  }}}}if (GrowBuffer.size() > AreaLimit) //判断结果(是否超出限定的大小),1为未超出,2为超出  CheckResult = 2;else{CheckResult = 1;RemoveCount++;//记录有多少区域被去除}for (int z = 0; z < GrowBuffer.size(); z++){CurrX = GrowBuffer.at(z).x;CurrY = GrowBuffer.at(z).y;PointLabel.at<uchar>(CurrY, CurrX) += CheckResult;//标记不合格的像素点,像素值为2}//********结束该点处的检查**********  }}}CheckMode = 255 * (1 - CheckMode);//开始反转面积过小的区域  for (int i = 0; i < Src.rows; ++i){for (int j = 0; j < Src.cols; ++j){if (PointLabel.at<uchar>(i, j) == 2){Dst.at<uchar>(i, j) = CheckMode;}else if (PointLabel.at<uchar>(i, j) == 3){Dst.at<uchar>(i, j) = Src.at<uchar>(i, j);}}}//cout << RemoveCount << " objects removed." << endl;
}

http://www.taodudu.cc/news/show-1639510.html

相关文章:

  • OpenCV图像处理(6)——轮廓标记
  • OpenCV图像处理(7)——图像上写TEXT
  • C++ 常见错误(00) —— C#调用c++做的dll是报错
  • C++ 常见错误(01) —— error LNK1104: 无法打开文件“avcodec.lib”
  • (1)癌症
  • C++ 常见错误(02) —— 将dll(用c++写的)处理的结果展示在界面上
  • C++ 常见错误(03) —— cout输出图像路径
  • OpenCV图像处理(9)——边缘提取方法对比
  • C++ 配置笔记
  • 深度学习(01)——安装anaconda
  • 深度学习(00)——GPU版本的TensorFlow
  • (0)图像处理界面——C#调用C++图像处理的DLL
  • OpenCV图像处理(12)——保存图像到指定位置
  • (0)C#开发环境构建——史上最容易理解的C#界面搭建
  • OpenCV图像处理(13)——指定区域截取和指定区域复制
  • (1)非对称加密
  • (1)非对称加密——RSA——史上最通俗的小白可看懂!
  • OSG仿真案例(7)——osg自动驾驶
  • OpenCV图像处理(14)——文件夹下所有图像转灰度
  • OSG仿真案例(8)——读取FBX格式文件并显示(无动画)
  • OSG仿真案例(9)——JY61陀螺仪控制飞机姿态
  • who I am ?
  • OSG仿真案例(10)——osg仿真录屏抓取图像,自定义修改路径,程序控制(而不是按键控制)...
  • C++相对路径下新建文件夹
  • OpenCV图像处理(14)—— 图像转视频
  • OpenCV图像处理(18)——文件夹下所有图像转灰度(14-15综合)
  • OpenCV图像处理(17)—— 各种二值化对比
  • 真正的研发之路(1)
  • (2)Mac安装Parallels无法上网
  • C++ Licence认证用于项目开发和设备认证

OpenCV图像处理(4)——去除小面积相关推荐

  1. python3 opencv3.4.5.20(高版本可行) 实现 matlab 去除小面积对象 bwareaopen函数

    def bwareaopen(image, p, level):#image为传入的灰度图或二值化后的图,p为小面积的大小,level为函数内部二值化阈值import cv2area = []area ...

  2. python-opencv去除小面积区域/孔洞填充(二值图像)

    上图左为原始图像,右图为填充后的图像. 因为左边的图片存在很多噪声点,直接根据阈值去填充会存在问题,所以我就先对图片进行了一次二值化处理,然后调用了opencv的fillPoly函数完成孔洞的填充. ...

  3. OpenCV图像处理(3)——盒维数计算

    计算分形盒子维 //************************// //计算分形盒子维 //*** yangxin_szu 2013_03_28 ***// //valarray与 MFC 有一 ...

  4. OpenCV图像处理(2)——形态学操作

    形态学操作 Mat element = getStructuringElement(MORPH_RECT, Size(9, 9)); morphologyEx(InputImage, OutputIm ...

  5. OpenCV图像处理(1)——指定文件夹写入图像

    文件夹写入图像 imwrite("./111/maoqiubiaozhu_" + std::to_string(i) + ".bmp", src);//在项目目 ...

  6. OpenCV图像处理(0)——文件夹批量读取文件

    读取文件夹下所有图像.jpg string file_path = "H:\\图像处理模板\\c++\\CmakeBuildOpenCVPrj\\Pic\\PillingImages\\Si ...

  7. OpenCV图像处理(Python)学习笔记

    OpenCV图像处理 OpenCV图像处理 第1章 OpenCV入门 第2章 图像处理基础 2.1 基本表示方法 2.2 感兴趣区域(ROI) 第3章 图像运算 3.1 加法运算 3.2 图像加权和 ...

  8. halcon opencv 图像处理面试指南

    珠海某上市公司算法总监: 1.相机标定的原理与坐标系之间的转换,如何转换 2.激光三角原理,如何搭建 3.测量拟合的过程中有哪些算子,原理什么,接着问5,跌代多少次?什么情况最优,如何优化, 4.那个 ...

  9. opencv图像处理总结

    opencv图像处理基本操作 1. 矩阵数据类型 通用矩阵数据类型: CV_<bit_depth>(S|U|F)C<number_of_channels> 其中,S表示带符号整 ...

最新文章

  1. ORA-04028: cannot generate diana for object xxx
  2. Spring AOP注解为什么失效?90%Java程序员不知道
  3. 谷歌:不守规矩的“顽童”
  4. vue 对象中数组中对象某个属性更改_vue之监听对象、对象数组的改变
  5. 计算机培训营,计算机学院举办科创训练营第三期培训
  6. rmd文件怎么转换html文件,如何将Rmd文件的html输出向左对齐
  7. 判断IP是否为搜索引擎蜘蛛或爬虫
  8. 一、瞰景Smart3D软件介绍
  9. 万年历插件软件测试,中华万年历app测试用例.xls
  10. 计算机函数公式发生额总计,16个Excel函数公式,解决会计工作中80﹪的难题!
  11. 【一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成】
  12. Spring全家桶视频教程
  13. (转)原始图像数据和PDF中的图像数据
  14. GDAL自带的 rpc纠正和金字塔文件生成方法
  15. Java内功设计模式 part2
  16. VS2019 彩虹括号插件
  17. 下载steam创意工坊
  18. 中国电信运营商重组与3G标准
  19. 《系统之美》读书之感
  20. 聚甲基丙烯酸甲酯(PMMA)微球PMMA Beads

热门文章

  1. 使用 Xilinx Documentation Navigator 查看官方文档
  2. 贺利坚老师汇编课程56笔记:CMP指令
  3. 字符串函数rpartition与partition
  4. luogu p1652 圆
  5. P1251 餐巾计划问题 费用流
  6. Know your weapons Ⅱ
  7. FJNU 1196 汪老司机(DP or 建图+最短路)
  8. Linux 文件内容替换命令
  9. 本人正式入驻博客园~
  10. AJax错误WebForm1没有定义的javascript错误的解决方法