opencv影象處理的一些常用函式簡單使用
阿新 • • 發佈:2019-01-25
```
//用到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);
}