OpneCV 二值图像区域处理
2016-07-20 14:04
260 查看
//--------------------------------------【程序说明】------------------------------------------- // 在图像处理中总会遇到二值图像,故对二值图像中区域处理在所难免; // 提取自己想要的区域部分对其处理; // 此函数简单实现高亮度区域处理; //------------------------------------------------------------------------------------------------ //---------------------------------【头文件、命名空间包含部分】---------------------------- // 描述:包含程序所使用的头文件和命名空间 //------------------------------------------------------------------------------------------------- #include <opencv2/opencv.hpp>//头文件 using namespace cv;//包含cv命名空间 using namespace std; //-----------------------------------【全局变量声明部分】-------------------------------------- // 描述:全局变量的声明 //----------------------------------------------------------------------------------------------- Mat g_srcImage; Mat g_grayImage; Mat g_dstImage; int g_nThresh_max = 255; vector <vector<Point>> g_vContours; //-----------------------------------【main( )函数】-------------------------------------------- int main() { // 读入待处理原始图像 g_srcImage = imread("C:/Users/Administrator/Desktop/2.jpg"); if(!g_srcImage.data ) { printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n"); return false; } imshow("原始图",g_srcImage); //-------------------------------------------------------------------------------------------------- //--------------------------根据高亮度特征-------------------------------------------- cvtColor(g_srcImage,g_grayImage,CV_BGR2GRAY); imshow("灰度图",g_grayImage); //adaptiveThreshold(g_grayImage,g_grayImage,g_nThresh_max,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,3,0);//自动阈值 //threshold(g_grayImage,g_grayImage,100,255,THRESH_BINARY); threshold(g_grayImage,g_grayImage,0,g_nThresh_max,CV_THRESH_OTSU); imshow("高亮度图像",g_grayImage); //waitKey(0); //----------------------------------------------------------------------------------------------------------- // 进行闭运算操作 Mat element = getStructuringElement(MORPH_RECT, Size(4, 4)); morphologyEx(g_grayImage,g_dstImage, MORPH_CLOSE, element); // 查找需要填充区域的轮廓 vector <Vec4i> hierarchy; findContours(g_dstImage,g_vContours,hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); // 将轮廓内填充 if( !g_vContours.empty() & !hierarchy.empty() ) { for (int idx=0;idx < g_vContours.size();idx++) { drawContours(g_dstImage,g_vContours,idx,Scalar::all(255),CV_FILLED,8);//填充轮廓内部 } } //------------------------------------------------------------------------------------------------ //-----------------------------取面积最大的一块---------------------------------------- double maxArea = 0; vector <Point> maxContour; findContours(g_dstImage,g_vContours,hierarchy,CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE); if( !g_vContours.empty() && !hierarchy.empty() ) { for (int idx=0;idx < g_vContours.size();idx++) { double contArea = contourArea(g_vContours[idx]);//当前区域的面积 // 求最大面积的区域 if( contArea>maxArea ) { maxArea = contArea; maxContour = g_vContours[idx]; } } } // 将轮廓转为矩形框 Rect maxRect = boundingRect(maxContour); // 显示连通域 Mat result1, result2; g_dstImage.copyTo(result1); g_dstImage.copyTo(result2); for (size_t i = 0; i < g_vContours.size(); i++) { Rect r = boundingRect(g_vContours[i]); rectangle(result1, r,Scalar(255)); } imshow("all regions", result1) ; rectangle(result2, maxRect, Scalar(255)); imshow("largest region", result2) ; waitKey(0); }
相关文章推荐
- [Funkunux] Linux_2.6.22.6 内核start_kernel函数分析之console_init
- 在centos6.5中安装 GitLab 全过程和问题记录
- Hadoop的MR程序中map的个数
- BusyBox 简化嵌入式 Linux 系统【转】
- nginx配置
- tar.gz tar bz2 zip
- Linux设备模型(热插拔、mdev 与 firmware)【转】
- 在yum 安装(docker方式安装)的redis 配置认证密码 和 限定IP登录
- LINUX_端口加到防火墙
- Docker入门-镜像、容器、仓库简单命令
- linux根文件系统制作之busybox编译和系统构建【转】
- Linux释放内存脚本
- greenplum编译安装
- Linux常用命令
- bad interpreter: 没有那个文件或目录
- shell截取字符串的方法
- VMware下最小化安装centos 7 后上网设置
- jdk and tomcat 环境变量配置
- mysql heartbeat 高可用
- 使用linux c 实现linux控制台 ls 命令