目錄
一、基礎理論
二、實戰
1、對x方向微分
2、對y方向微分
3、線性混合
總代碼
其他應用
參考資料
一、基礎理論
Sobel算子:用于邊緣檢測的離散微分算子,(一階)
作用:
1、邊緣檢測: Gx 用于檢測縱向邊緣, Gy 用于檢測橫向邊緣.
2、計演算法線: Gx 用于計演算法線的橫向偏移, Gy 用于計演算法線的縱向偏移.
原理:
垂直方向的邊緣在水平方向的梯度(偏導數)幅值較大
水平方向的邊緣在垂直方向的梯度(偏導數)幅值較大
Sobel算子剛好能描述這個影像變化,
梯度公式:
對于影像而言,它是離散的,所以h的最小值只能是1了,那么這意味著,影像中某個像素位置的梯度(以x方向為例)等于它左右兩個像素點的像素之差除以2,
例:假設有一行像素是這樣分布的:
123 155 173
那么,像素值為155的像素位置x方向的梯度為(173 - 123)/2 = 25
Prewitt算子:x方向和y方向卷積核分別為:

sobel算子:在此基礎上加了一些權值,結合了高斯平滑和微分求導,
Sebel算子x方向和y方向的卷積核分別為:

求出了水平方向和豎直方向的梯度Gx和Gy之后
近似的梯度就可以用下面的方法算出來:

Sobel函式:
void Sobel (InputArray src, OutputArray dst, int ddepth, int dx, int dy, int ksize=3,
double scale=1, double delta=0, int borderType=BORDER_DEFAULT );
(更佳的3*3濾波器:Scahrr ()函式)
二、實戰
首先欣賞下原圖及灰度圖:
src = imread("Resource/test12.jpg");
imshow("原圖", src);
cvtColor(src, gray, COLOR_RGB2GRAY); //轉變為灰度圖
imshow("灰度圖", src);

1、對x方向微分
//對x方向微分
Sobel(gray, grad_x, CV_16S, 1, 0, 3);
// x方向差分階數 y方向差分階數 核大小
convertScaleAbs(grad_x, abs_grad_x); //可將任意型別的資料轉化為CV_8UC1
imshow("【邊緣圖x】", abs_grad_x);
//邊緣與梯度方向垂直,所以輸出的邊緣是和我們所計算的某一方向的梯度是垂直的

2、對y方向微分
//對y方向微分
Sobel(gray, grad_y, CV_16S, 0, 1, 3);
// x方向差分階數 y方向差分階數 核大小
convertScaleAbs(grad_y, abs_grad_y); //可將任意型別的資料轉化為CV_8UC1
imshow("邊緣圖y", abs_grad_y);

3、線性混合
//影像的線性混合
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
imshow("線性混合", dst);

總代碼
//Sobel算子(微分)
#include<opencv2/opencv.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
int main()
{
Mat src, dst, gray, grad_x, grad_y, abs_grad_x, abs_grad_y;
src = imread("Resource/test12.jpg");
imshow("原圖", src);
cvtColor(src, gray, COLOR_RGB2GRAY); //轉變為灰度圖
imshow("灰度圖", gray);
//對x方向微分
Sobel(gray, grad_x, CV_16S, 1, 0, 3);
// x方向差分階數 y方向差分階數 核大小
convertScaleAbs(grad_x, abs_grad_x); //可將任意型別的資料轉化為CV_8UC1
imshow("邊緣圖x", abs_grad_x);
//邊緣與梯度方向垂直,所以輸出的邊緣是和我們所計算的某一方向的梯度是垂直的
//對y方向微分
Sobel(gray, grad_y, CV_16S, 0, 1, 3);
// x方向差分階數 y方向差分階數 核大小
convertScaleAbs(grad_y, abs_grad_y); //可將任意型別的資料轉化為CV_8UC1
imshow("邊緣圖y", abs_grad_y);
//影像的線性混合
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
imshow("線性混合", dst);
waitKey(0);
}
其他應用

x方向梯度(使豎直的黑條特征變得明顯):

參考資料
https://blog.csdn.net/weixin_44586473/article/details/93229385?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162895010516780271586263%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162895010516780271586263&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-93229385.ecpm_v1_rank_v29&utm_term=sobel&spm=1018.2226.3001.4187
https://www.baidu.com/link?url=14oBZycvBio7eVQbSDl-XWg_eyg92lbbpOCNxZu5g-rxq39fby3yvmI-_OYGULcmmQ0SuvMyGJU0dBPCZBeEYKHPi_pldWGT23zLbLry6DG&wd=&eqid=efae8130000106120000000561187322
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/294319.html
標籤:其他
