1. 程式人生 > >opencv影象處理的一些常用函式簡單使用

opencv影象處理的一些常用函式簡單使用

```
//用到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);

}