sobel算子_OpenCV 学习:4 Sobel算子
生活随笔
收集整理的這篇文章主要介紹了
sobel算子_OpenCV 学习:4 Sobel算子
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1 背景介紹
圖像底層的處理對象,比如圖像的噪點、邊緣、直線、圓、特征點等為目的。那么本章主要解決的問題是如何提取圖形中的邊緣?是我們關(guān)心中的重點。那么,其數(shù)學原理是一階離散差分的形式。故我們知道把一個圖像處理轉(zhuǎn)變?yōu)榛叶葓D像,就是處理這張圖像的每個像素灰度的變化,那么在邊緣處,灰度變化比較明顯(對應著其梯度或者灰度矢量的變化)。
2 Sobel算子的形式
- 圖像處理絕大數(shù)在卷積操作,Opencv 會提供一個 或者 或者其他大小的 kernel,也就是卷積核。對于卷積核操作,首先我們要明白卷積原理。
卷積公式:
我擦,看到他的定義瞬間懵掉了。那么他到底解釋的什么?我給出引用其他小伙伴的卷積解釋卷積到底是什么?我還是一臉霧水,當我看到以下證明時,我才完全明白其來源和含義:
設二維連續(xù)型隨機變量
的概率密度函數(shù)為 ,則隨機變量 的概率密度? 的求解過程為:那么:
則:
其實,卷積函數(shù)就是二階積分一種特殊情況的一元積分形式。
- Sobel 卷積算子, 軸方向的變化和 軸方向的變化
看到
和 你會疑問為什么 Sobel 算子會長成這個樣子?要解決這一個疑問,首先要知道,一階差分方程形式為: 在求 方向上變化, 在求 方向上變化。至于為什么會出現(xiàn)數(shù)字2,我的思考是當前像素位置 上類似于高斯權(quán)重的分配。左右變換大為 ,上下變換大為 。若
為原始圖像,那么在 方向上的卷積為:那么在
方向上的卷積為:具體計算方式如下:
其中
表示圖像 點的灰度值。那么,改點的灰度梯度為:
如果梯度
大于某一閥值則認為該點 為邊緣點。
Sobel算子根據(jù)像素點上下、左右鄰點灰度加權(quán)差,在邊緣處達到極值這一現(xiàn)象檢測邊緣。對噪聲具有平滑作用,提供較為精確的邊緣方向信息,邊緣定位精度不夠高。當對精度要求不是很高時,是一種較為常用的邊緣檢測方法。
3 API 函數(shù)介紹
void cv::Sobel( InputArray _src, OutputArray _dst, int ddepth, int dx, int dy,int ksize, double scale, double delta, int borderType )第一個參數(shù):_src 輸入的源影像 第二個參數(shù):_dst輸出的目標影像,大小和通道數(shù)與源影像相同。深度由ddepth來決定第三個參數(shù):目標影像的深度;當源源影像的深度為CV_8U時,一般ddepth選擇為CV_16S第四個參數(shù):x方向上的導數(shù)因子第五個參數(shù):Y方向上的導數(shù)因子第六個參數(shù):如果ksize<0的時候,那么使用scharr內(nèi)核過濾因子。scharr的內(nèi)核過濾因子大小為3。dx大于等于0,dy大于等于0,并且dx+dy==1 #include <opencv2/core/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream>using namespace cv; using namespace std;int main(int argc, char **argv) {Mat image = imread("/Users/cc/Desktop/OpenCV/demo/MyOpenCvDemo/MyDemo/swk.jpeg");if (image.empty()){cout << "could not find the image resource ..." << endl;return -1;}Mat grayImg;cvtColor(image, grayImg, COLOR_BGR2GRAY);Mat sobelx;Sobel(grayImg, sobelx, CV_32F, 1, 0);double minVal, maxVal;minMaxLoc(sobelx, &minVal, &maxVal);Mat draw;sobelx.convertTo(draw, CV_8U, 255.0 / (maxVal - minVal), -minVal * 255.0 / (maxVal - minVal));namedWindow("My Image", CV_WINDOW_AUTOSIZE);imshow("My Image", draw);waitKey(0);return 0; }4 運行結(jié)果
總結(jié)
以上是生活随笔為你收集整理的sobel算子_OpenCV 学习:4 Sobel算子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel打印预览在哪里_Excel如何
- 下一篇: uniapp 子组件 props拿不到数