opencv图像处理的一些常用函数简单使用

转自:http://www.cnblogs.com/ggYYa/p/5687046.html
及二值区域的简单处理:http://www.cnblogs.com/ggYYa/p/5688139.html
谢谢分享!在这里收藏了~

```
//用到opencv 中的函数时往往会一时记不起这个函数的具体参数怎么设置,故在此将常用函数做一汇总;

Mat srcImage = imread("C:/Users/Administrator/Desktop/车牌识别/车牌图像库/1.jpg");//读入图像函数

imshow("原图",srcImage);//显示图像函数

imwrite("图3.jpg",imageRIO);//保存图像函数

Mat imageRIO = srcImage(Rect(50,50,100,000));//感兴趣区域函数

cvtColor(srcImage,dstImage,CV_BGR2GRAY);//图像灰度化


//边缘检测 Sobel Laplacian Canny 其中Canny算子只能处理(8位)灰度图,其余两种8位32位都可以
Mat grad_x,grad_y;
Sobel(imgGray,grad_x,CV_8U,1,0,3,1,1);//X方向上的Sobel算子检测,其中3,1,0都是默认值

Sobel(imgGray,grad_y,CV_8U,0,1,3,1,0);//Y方向上的Sobel算子检测,其中3,1,0都是默认值

addWeighted(grad_x,0.5,grad_y,0.5,0,dstImage);//合并梯度

Laplacian(imgGray,dstImage,CV_8U);

Canny(imgGray,dstImage,50,200,3);//50和200表示第一个滞后性阈值和第二个滞后性阈值,较小者用于边缘连接,较大者控制强边缘的初始段,达阈值opnecv推荐为小阈值的3倍;
//3表示应用的Sobel算子的孔径大小 有默认值为3;

// 寻找轮廓 只处理8位 即灰度图像
vector<vector<Point>> contours;
findContours(imgGray,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE);
drawContours(dstImage,contours,-1,Scalar(0),3);
imshow("轮廓图",dstImage);


//阈值化操作
threshold(srcImage,dstImage,100,255,3);
imshow("固定阈值化图像",dstImage);
adaptiveThreshold(imgGray,dstImage,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,3,1);
imshow("自适应阈值化图像",dstImage);


// resize函数实现
resize(srcImage,dstImage,Size(),0.5,0.5);//缩小为一半
resize(srcImage,dstImage,Size(),2,2);//放大2倍
resize(srcImage,dstImage,Size(srcImage.cols*3,srcImage.rows*3));//放大3倍


// 金字塔函数实现
pyrUp(srcImage,dstImage,Size(srcImage.cols*2,srcImage.rows*2));// 放大2倍
pyrDown(srcImage,dstImage,Size(srcImage.cols/2,srcImage.rows/2));// 缩小2倍

//漫水填充算法
Rect ccomp;
floodFill(srcImage,Point(50,300),Scalar(155,255,55),&ccomp,Scalar(20,20,20),Scalar(20,20,20));

//膨胀腐蚀
Mat element = getStructuringElement(MORPH_RECT,Size(15,15));
erode(srcImage,dstImage,element);//腐蚀函数
dilate(srcImage,dstImage,element);//膨胀函数

morphologyEx(g_bgrImage,g_bgrImage, MORPH_CLOSE, element);//闭运算

morphologyEx(g_bgrImage,g_bgrImage, MORPH_OPEN, element);//开运算


//滤波
boxFilter(srcImage,dstImage,-1,Size(3,3));
imshow("方框滤波图",dstImage);

blur(srcImage,dstImage,Size(3,3));
imshow("均值滤波图",dstImage);

GaussianBlur(srcImage,dstImage,Size(5,7),1,1);
imshow("高斯滤波图",dstImage);

medianBlur(image,out,7);//中值滤波,7为孔径的线性尺寸
bilateralFilter(src,dst,d,sigmaColor,sigmaSpace);//双边滤波,d表示过滤过程中每个像素邻域的直径,sigmaColor颜色空间滤波器的sigma值,sigmaSpace表示坐标空间中滤波器的sigma值
bilateralFilter(image,out,25,25*2,25/2);

opencv二值图像处理:

//--------------------------------------【程序说明】-------------------------------------------
// 在图像处理中总会遇到二值图像,故对二值图像中区域处理在所难免;
// 提取自己想要的区域部分对其处理;
// 此函数简单实现高亮度区域处理;
//------------------------------------------------------------------------------------------------
//---------------------------------【头文件、命名空间包含部分】----------------------------
//        描述:包含程序所使用的头文件和命名空间
//-------------------------------------------------------------------------------------------------
#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);

}

谢谢!
转自:http://www.cnblogs.com/ggYYa/p/5687046.html
及二值区域的简单处理:http://www.cnblogs.com/ggYYa/p/5688139.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值