最全OpenCV教程及圖像處理它碎、目標(biāo)跟蹤券敌、識別案例
基本概念
sobel算子是一個主要用于邊緣檢測的離散微分算子。他結(jié)合了高斯平滑和微分求導(dǎo)没龙,用來計算圖像灰度函數(shù)的近似梯度铺厨,在圖像的任何一點使用此算子,都會產(chǎn)生對應(yīng)的梯度矢量或者是其他矢量硬纤。
sobel算子的計算過程
sobel算子函數(shù):sobel()函數(shù)
void Sobel( InputArray src, // 輸入圖像解滓。Mat類即可
? ? ? ? ? ? ? ? ? ? OutputArray dst,// 目標(biāo)圖像,函數(shù)輸出參數(shù)筝家,需要和源圖片有一樣的尺寸和類型
? ? ? ? ? ? ? ? ? ? int ddepth,// 輸出圖像的深度洼裤,比如src.depth(),和dddepth的組合
? ? ? ? ? ? ? ? ? ? int dx, 、// x方向的差分階數(shù)
? ? ? ? ? ? ? ? ? ? int dy, // y方向的差分階數(shù)
? ? ? ? ? ? ? ? ? ? int ksize = 3,// 有默認值3溪王,表示sobel核的大小腮鞍,必須取1,3莹菱,5移国,7
? ? ? ? ? ? ? ? ? ? double scale = 1,// 計算導(dǎo)數(shù)值可選的縮放因子,默認值是1道伟,表示默認情況下是沒有應(yīng)用縮放的
? ? ? ? ? ? ? ? ? ? double delta = 0,// 表示在結(jié)果存入目標(biāo)圖(第二個參數(shù)dst)之前可選的值belda迹缀,有默認值為0
? ? ? ? ? ? ? ? ? ? int borderType = BORDER_DEFAULT ); ?//邊界模式
參數(shù)詳解
代碼實現(xiàn)
NSString *image = @"try.png";
UIImage *image1 = [UIImage imageNamed:image];
Mat im;
UIImageToMat(image1, im);
if (im.empty()) {
return;
}
// 創(chuàng)建X,Y方向梯度圖像的變量
Mat grad_x,grad_y;
// 梯度的絕對值
Mat abs_grad_x,abs_grad_y;
// 轉(zhuǎn)換為灰度圖像
cvtColor(im, src, COLOR_RGBA2GRAY);
// 求x方向的梯度
Sobel(src, grad_x, CV_16S, 1, 0);
convertScaleAbs(grad_x, abs_grad_x);
// 求y方向的梯度
Sobel(src, grad_y, CV_16S, 0, 1);
convertScaleAbs(grad_y, abs_grad_y);
// 合并梯度
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
self.secondImageView.image = MatToUIImage(dst);
其中函數(shù)convertScaleAbs() 蜜徽,使用線性變換轉(zhuǎn)換輸入數(shù)組元素成8位無符號整數(shù)