opencv : 边缘区域去除
来源:互联网 发布:win10美化成mac 编辑:程序博客网 时间:2024/04/29 08:44
边缘区域的定义:图像上的一个区域位于边缘。如下图所示:
标号1 为一个边缘区域
现在希望可以将图像中的边缘区域去除。一个简单的思路如下:
遍历图像上下左右四条边界上的像素。设置一个计数器和一个最小边界阈值。当边界满足要求的像素个数大于阈值,就作为一个待处理区域。并选取其中一个坐标点作为种子点进行满水填充为0。
代码如下:
Mat src=imread("F:/test.JPG"); imshow("src",src); //灰度化 Mat grayImage; cvtColor(src,grayImage,CV_BGR2GRAY); //二值化原图像 Mat thresImage=Mat::zeros(grayImage.rows,grayImage.cols,CV_8UC1); threshold(grayImage,thresImage,127,255,THRESH_BINARY); imshow("thresImage",thresImage); const int nr=thresImage.rows; const int nc=thresImage.cols; Mat edge[4]; edge[0] = thresImage.row(0); //up edge[1] = thresImage.row(nr-1); //bottom edge[2] = thresImage.col(0); //left edge[3] = thresImage.col(nc-1); //right std::vector<Point> edgePts; const int minLength=std::min(nr,nc)/4; for(int i=0;i<4;++i) { std::vector<Point> line; Mat_<uchar>::const_iterator iter = edge[i].begin<uchar>(); //当前像素 Mat_<uchar>::const_iterator nextIter = edge[i].begin<uchar>()+1; //下一个像素 while(nextIter!=edge[i].end<uchar>()) { if(*iter==255) { if(*nextIter==255) { Point pt = iter.pos(); if(i==1) pt.y = nr-1; if(i==3) pt.x = nc-1; line.push_back(pt); } if(*nextIter!=255) { if(line.size()>minLength) edgePts.push_back(line.at(line.size()/2)); line.clear(); } } ++iter; ++nextIter; } } for(int n =0; n<edgePts.size();++n) floodFill(thresImage,edgePts[n],0);//漫水填充法
效果:
0 0
- opencv : 边缘区域去除
- OPENCV去除小连通区域,去除孔洞
- OPENCV去除小连通区域,去除孔洞
- Opencv for Unity去除离散区域
- Opencv 图像分割: 阈值化分割 区域分割 边缘分割
- 矩形区域边缘
- 矩形区域边缘
- opencv 边缘羽化,边缘过渡
- opencv 边缘羽化,边缘过渡
- 自定义titlebar,去除边缘阴影
- 【OpenCV】Canny 边缘检测
- Opencv边缘检测
- opencv-canny边缘检测
- OpenCV边缘检测
- opencv 图像的边缘
- opencv canny边缘检测
- opencv-边缘检测
- OpenCV边缘检测
- 数学抽屉原理
- Leetdode Partition List
- 《SpringAop》------切入点表达式
- 安培与特朗普谈什么?
- 微波技术基础----阻抗匹配例题和详解
- opencv : 边缘区域去除
- 【读书笔记】《智能时代》吴军
- 后缀自动机的构造
- Apache通用日志工具commons-logging和Log4j使用总结
- JavaScript创建对象4种方法详解
- 05 网络和存储
- 使用eclipse建立webservice服务和客户端
- 《零点起飞学C语言(康莉)》读书笔记十
- RabbitMQ集群和高可用配置的技巧