您的位置:首页 > 运维架构

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);

}










内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: