OpenCV筆記---閾值 、模糊濾波、膨脹與腐蝕

閾值二值化 cv:threshold

輸入爲灰度圖像

threshold(src, dst, 127, 255, THRESH_BINARY);  
reshold(src                  //輸入  
        dst                 //輸出  
        thresh           //閾值  
        maxValue     //二值化最大值  
         thresholdType //閾值類型  CV_THRESH_OTSU
         )

自適應閾值   cv::adaptiveThreshold

adaptiveThreshold(gray, dst2, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 5,8); //自適應閾值,高斯分佈 5*5. 閾值爲高斯均值-8  
adaptiveThreshold(  
    InputArry     src,  
    OutputArrt    dst,  
    double        maxValue        //設置最大值  
    int           adaptiveMethod  //均值或高斯取值  
                                  //ADAPTIVE_THRESH_MEAN_C  
                                  //ADAPTIVE_THRESH_GAUSSIAN_C  
    int           thresholdType   //閾值類型  
   int           blockSize       //方框邊長 爲奇數  
   double        C               //閾值未取高斯閾值-C  
} 

 平滑與濾波

簡單模糊 blur

	blur(mat, img_blur, Size(11, 11), Point(-1, -1));//均值模糊
	void blur(
		InpurArry  src,
		OutputArry dst,
		Size       Ksize    //模糊盒裝塊大小
		Point      anchor   //核的位置一般未Point(-1,-1),表示居中
		int        borderType //一般不輸入

	)

高斯模糊 GaussianBlur

	GaussianBlur(mat, img_gar, Size(11, 11), 11, 11);
	void GaussianBlur(
		InpurArry  src,
		OutputArry dst,
		Size       Ksize    //模糊盒裝塊大小
		double     sigmaX   //X方向方差
		double     sigmaY   //Y方向方差
		int        borderType //沒用

	)

 中值濾波器(去除黑白點)

medianBlur(src, dst, 11);
void medianBlur(InputArray src, OutputArray dst, int ksize);//ksize方塊邊長

雙邊濾波器(邊緣保留) bilateralFilter 

邊界在,細節被濾去

    bilateralFilter(src, dst, 15, 150, 3);
	//15計算半徑, 150 決定多少差值之內的像素會被計算,3如果d大於0則無效,否則用他來計算d的值
	//邊緣保留的濾波算法
	void bilateralFilter(InputArray src, OutputArray dst, 
		int d,               //半徑       
		double sigmaColor,   //顏色權重函數的寬度參數,差值之內的被計算
		double sigmaSpace,   //空間權函數的寬度參數
		int borderType = BORDER_DEFAULT
	);

任意線性濾波器做卷積

每一個圖元與算子進行卷積來達到濾波的目的

Robert算子:45度方向求導數

Sobel算子:x y方向求導數

拉普拉斯算子:全導數

卷積函數:

void filter2D( InputArray src, OutputArray dst, 
                            int ddepth,       //深度,不知道的寫 -1
                            InputArray kernel,  //卷積算子
                            Point anchor = Point(-1,-1),
                            double delta = 0, int borderType = BORDER_DEFAULT );

索貝爾函數:

Sobel( InputArray src, OutputArray dst, int ddepth,
       int dx, int dy, //求導順序取值0 1 2,0表示不求導
       int ksize = 3,
       double scale = 1, double delta = 0,
       int borderType = BORDER_DEFAULT );

拉普拉斯變換函數 (二次求導取出邊緣)

void Laplacian( InputArray src, OutputArray dst, int ddepth,
                int ksize = 1, double scale = 1, double delta = 0,
                int borderType = BORDER_DEFAULT );

圖像形態學

膨脹與腐蝕

目標像素點的值替換爲卷積核覆蓋區域 的局部最大(小)值

先獲得圖元getStructuringElement

Mat structure = getStructuringElement(MORPH_RECT, Size(s, s), Point(-1, -1));
Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));
//ship MORPH_RECT(一般是)(長方形) \MORPH_CROSS\MORPH_ELLIPSE
//esize 如Size(s*s) s爲奇數,指的是卷積核覆蓋區域大小
//錨點默認Point(-1, -1))指中心

膨脹 dilate

dilate(src, dst, structure, Point(-1, -1));
void dilate(InputArray src, OutputArray dst, //輸入輸出
		    InputArray kernel,                       //輸入圖元
		    Point anchor = Point(-1, -1), int iterations = 1,
		    int borderType = BORDER_CONSTANT,        //暫時沒用,不用輸入
		    const Scalar& borderValue = morphologyDefaultBorderValue() //暫時沒用,不用輸入
);

腐蝕 erode

erode(src, dst, structure, Point(-1, -1));//同膨脹
void erode( InputArray src, OutputArray dst, InputArray kernel,
            Point anchor = Point(-1,-1), int iterations = 1,
            int borderType = BORDER_CONSTANT,
            const Scalar& borderValue = morphologyDefaultBorderValue() );

形態學操作:

CV_MOP_OPEN 開操作 先腐蝕,後膨脹,可以去掉小的對象。
CV_MOP_CLOSE 閉操作 先膨脹,後腐蝕,可以填充小的洞。
CV_MOP_GRADIENT 形態學梯度 膨脹減去腐蝕 gradient(src)=dilate(src)-erode(src),高亮圖中變化劇烈的部分
CV_MOP_TOPHAT 頂帽 原圖像與開操作圖像的差值,明亮的局部(黑線條的背光)被提取出來
CV_MOP_BLACKHAT 黑帽  閉圖像與原圖像的差值,暗洞(黑線條)被提取出來
void morphologyEx( InputArray src, OutputArray dst,
                   int op,           //選擇形態學操作,如開操作 CV_MOP_OPEN ,閉操作CV_MOP_CLOSE
                   InputArray kernel,//輸入結構元素,圖元
                   Point anchor = Point(-1,-1), //位置,默認中心
                   int iterations = 1,          //迭代次數,默認1
                   int borderType = BORDER_CONSTANT,
                   const Scalar& borderValue = morphologyDefaultBorderValue() );

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章