//--------------------------------------【程序说明】-------------------------------------------
// 在图像处理中总会遇到二值图像,故对二值图像中区域处理在所难免;
// 提取自己想要的区域部分对其处理;
// 此函数简单实现高亮度区域处理;
//------------------------------------------------------------------------------------------------
//---------------------------------【头文件、命名空间包含部分】----------------------------
// 描述:包含程序所使用的头文件和命名空间
//-------------------------------------------------------------------------------------------------
#include <opencv2/opencv.hpp>//头文件
using namespace cv;//包含cv命名空间
using namespace std; //-----------------------------------【全局变量声明部分】--------------------------------------
// 描述:全局变量的声明
//-----------------------------------------------------------------------------------------------
Mat g_srcImage;
Mat g_grayImage;
Mat g_dstImage;
int g_nThresh_max = ;
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,,g_nThresh_max,CV_THRESH_OTSU);
imshow("高亮度图像",g_grayImage);
//waitKey(0); //----------------------------------------------------------------------------------------------------------- // 进行闭运算操作
Mat element = getStructuringElement(MORPH_RECT, Size(, ));
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=;idx < g_vContours.size();idx++)
{ drawContours(g_dstImage,g_vContours,idx,Scalar::all(),CV_FILLED,);//填充轮廓内部 }
} //------------------------------------------------------------------------------------------------ //-----------------------------取面积最大的一块----------------------------------------
double maxArea = ;
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=;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 = ; i < g_vContours.size(); i++)
{
Rect r = boundingRect(g_vContours[i]);
rectangle(result1, r,Scalar());
}
imshow("all regions", result1) ; rectangle(result2, maxRect, Scalar());
imshow("largest region", result2) ; waitKey(); }

  

 

OpneCV 二值图像区域处理的更多相关文章

  1. OpenCV:二值图像连通区域分析与标记算法实现

    http://blog.csdn.net/cooelf/article/details/26581539?utm_source=tuicool&utm_medium=referral Open ...

  2. Matlab得到二值图像中最大连通区域

    有时候要将二值化图像中最大的连通域保存下来.以下函数提供了一种方法: %function [img]=maxLianTongYu(I):求图像中最大的连通域 %输入:I 输入图像 %输出:img 仅包 ...

  3. OpenCV二值图像孔洞填充的一个简单方法

    在Matlab下,使用imfill可以很容易的完成孔洞填充操作,感觉这是一个极为常用的方法,然而不知道为什么OpenCV里面却没有集成这个函数.在网上查了好多关于Opencv下的孔洞填充方法,大部分使 ...

  4. matlab函数_连通区域

    1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二值图像BW中面积小于P的对象,默认情况下使用8邻域.算法:(1)De ...

  5. Opencv2系列学习笔记10(提取连通区域轮廓)

    连通区域指的是二值图像中相连像素组成的形状.而内.外轮廓的概念及opencv1中如何提取二值图像的轮廓见我的这篇博客:http://blog.csdn.net/lu597203933/article/ ...

  6. Opencv2系列学习笔记10(提取连通区域轮廓) 另一个

    http://blog.csdn.net/lu597203933/article/details/17362457 连通区域指的是二值图像中相连像素组成的形状.而内.外轮廓的概念及opencv1中如何 ...

  7. 最大黑区域-DFS

    最大黑区域 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practic ...

  8. 超越halcon速度的二值图像的腐蚀和膨胀,实现目前最快的半径相关类算法(附核心源码)。

    我在两年前的博客里曾经写过 SSE图像算法优化系列七:基于SSE实现的极速的矩形核腐蚀和膨胀(最大值和最小值)算法  一文,通过SSE的优化把矩形核心的腐蚀和膨胀做到了不仅和半径无关,而且速度也相当的 ...

  9. 【转】matlab函数_连通区域

    转载自einyboy的博文Matlab的regionprops详解 1. matlab函数bwareaopen──删除小面积对象格式:BW2 = bwareaopen(BW,P,conn)作用:删除二 ...

随机推荐

  1. Linux的bg和fg命令简单介绍

    我们都知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务.而不能让程序在前台后台之间切换.而 Linux 提供了 fg 和 bg 命令,让我们轻松调度正在运行的 ...

  2. select resharper shortcuts scheme

    VS代码生成工具ReSharper提供了丰富的快捷键,可以极大地提高你的开发效率.安装ReSharper后首次启动Visual Studio时,会出现一个名为ReSharper Keyboard Sc ...

  3. hdu 2053 Switch Game 水题一枚,鉴定完毕

    Switch Game Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. CentOS安装zookeeper

    1.zookeeper是个什么玩意? 顾名思义zookeeper就是动物园管理员,他是用来管hadoop(大象).Hive(蜜蜂).pig(小猪)的管理员, Apache Hbase和 Apache  ...

  5. Codeforces Round #368 (Div. 2) A

    Description Small, but very brave, mouse Brain was not accepted to summer school of young villains. ...

  6. 2016年12月9日 星期五 --出埃及记 Exodus 21:4

    2016年12月9日 星期五 --出埃及记 Exodus 21:4 If his master gives him a wife and she bears him sons or daughters ...

  7. BZOJ 3640 JC的小苹果(逆矩阵)

    题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3640 题意:给出一个无向图,从1走到n.开始是血量H,从u到达v时血量减少a[v] ...

  8. RC4加密解密算法

    RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数 ...

  9. 【转载】linux内核笔记之进程地址空间

    原文:linux内核笔记之进程地址空间 进程的地址空间由允许进程使用的全部线性地址组成,在32位系统中为0~3GB,每个进程看到的线性地址集合是不同的. 内核通过线性区的资源(数据结构)来表示线性地址 ...

  10. Mybatis+SpringMVC+Spring整合

    1,先添加spring支持: applicationContext.xml  配在WEBINF下,四个命名空间:aop,context,tx,p 配Listener:ContextLoaderList ...