OpenCV图像处理(4)——去除小面积
去除小面积(注:输出图像需要初始化,否则会报错)
/*
参数说明: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)——去除小面积相关推荐
- python3 opencv3.4.5.20(高版本可行) 实现 matlab 去除小面积对象 bwareaopen函数
def bwareaopen(image, p, level):#image为传入的灰度图或二值化后的图,p为小面积的大小,level为函数内部二值化阈值import cv2area = []area ...
- python-opencv去除小面积区域/孔洞填充(二值图像)
上图左为原始图像,右图为填充后的图像. 因为左边的图片存在很多噪声点,直接根据阈值去填充会存在问题,所以我就先对图片进行了一次二值化处理,然后调用了opencv的fillPoly函数完成孔洞的填充. ...
- OpenCV图像处理(3)——盒维数计算
计算分形盒子维 //************************// //计算分形盒子维 //*** yangxin_szu 2013_03_28 ***// //valarray与 MFC 有一 ...
- OpenCV图像处理(2)——形态学操作
形态学操作 Mat element = getStructuringElement(MORPH_RECT, Size(9, 9)); morphologyEx(InputImage, OutputIm ...
- OpenCV图像处理(1)——指定文件夹写入图像
文件夹写入图像 imwrite("./111/maoqiubiaozhu_" + std::to_string(i) + ".bmp", src);//在项目目 ...
- OpenCV图像处理(0)——文件夹批量读取文件
读取文件夹下所有图像.jpg string file_path = "H:\\图像处理模板\\c++\\CmakeBuildOpenCVPrj\\Pic\\PillingImages\\Si ...
- OpenCV图像处理(Python)学习笔记
OpenCV图像处理 OpenCV图像处理 第1章 OpenCV入门 第2章 图像处理基础 2.1 基本表示方法 2.2 感兴趣区域(ROI) 第3章 图像运算 3.1 加法运算 3.2 图像加权和 ...
- halcon opencv 图像处理面试指南
珠海某上市公司算法总监: 1.相机标定的原理与坐标系之间的转换,如何转换 2.激光三角原理,如何搭建 3.测量拟合的过程中有哪些算子,原理什么,接着问5,跌代多少次?什么情况最优,如何优化, 4.那个 ...
- opencv图像处理总结
opencv图像处理基本操作 1. 矩阵数据类型 通用矩阵数据类型: CV_<bit_depth>(S|U|F)C<number_of_channels> 其中,S表示带符号整 ...
最新文章
- ORA-04028: cannot generate diana for object xxx
- Spring AOP注解为什么失效?90%Java程序员不知道
- 谷歌:不守规矩的“顽童”
- vue 对象中数组中对象某个属性更改_vue之监听对象、对象数组的改变
- 计算机培训营,计算机学院举办科创训练营第三期培训
- rmd文件怎么转换html文件,如何将Rmd文件的html输出向左对齐
- 判断IP是否为搜索引擎蜘蛛或爬虫
- 一、瞰景Smart3D软件介绍
- 万年历插件软件测试,中华万年历app测试用例.xls
- 计算机函数公式发生额总计,16个Excel函数公式,解决会计工作中80﹪的难题!
- 【一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成】
- Spring全家桶视频教程
- (转)原始图像数据和PDF中的图像数据
- GDAL自带的 rpc纠正和金字塔文件生成方法
- Java内功设计模式 part2
- VS2019 彩虹括号插件
- 下载steam创意工坊
- 中国电信运营商重组与3G标准
- 《系统之美》读书之感
- 聚甲基丙烯酸甲酯(PMMA)微球PMMA Beads