sobel算子实现

原理:
在这里插入图片描述在这里插入图片描述
实现:

/** * @description: 计算阶乘 * @param n 自然数 * @return 阶乘 */
int factorialint n) 
{ 

int fac = 1;
if n == 0)	return fac;
for int i = 1; i <= n; ++i)	fac *= i;
return fac;
}
/** * @description: 获得Sobel平滑算子 * @param size 掩膜大小 * @return Sobel平滑算子 */
cv::Mat getSobelSmoothint size)
{ 

int n = size - 1;
cv::Mat SobelSmoothoper = cv::Mat::zerossize, 1, CV_32F);
for int k = 0; k <= n; k++)
{ 

float *pt = SobelSmoothoper.ptr<float>0);
pt[k] = factorialn) / factorialk)*factorialn - k));
}
return SobelSmoothoper;
}
/** * @description: 获得Sobel差分算子 * @param size 掩膜大小 * @return Sobel差分算子 */
cv::Mat getSobeldiffint size)
{ 

cv::Mat Sobeldiffoper = cv::Mat::zeroscv::Sizesize, 1), CV_32F);
cv::Mat SobelSmooth = getSobelSmoothsize - 1);
for int k = 0; k < size; k++) 
{ 

if k == 0)
Sobeldiffoper.at<float>0, k) = 1;
else if k == size - 1)
Sobeldiffoper.at<float>0, k) = -1;
else
Sobeldiffoper.at<float>0, k) = SobelSmooth.at<float>0, k) - SobelSmooth.at<float>0, k - 1);
}
return Sobeldiffoper;
}
/** * @description: 卷积实现 * @param src 输入图像 * @param dst 输出图像 * @param kernel 卷积核 */
void conv2Dcv::Mat& src, cv::Mat& dst, cv::Mat kernel)
{ 

cv::flipkernel, kernel, -1);
cv::filter2Dsrc, dst, src.depth), kernel);
}
/** * @description: 可分离卷积———先水平方向卷积,后垂直方向卷积 * @param src 输入图像 * @param dst 输出图像 * @param kernel_X x方向卷积 * @param kernel_Y y方向卷积 */
void sepConv2D_X_Ycv::Mat& src, cv::Mat& dst, cv::Mat kernel_X, cv::Mat kernel_Y)
{ 

cv::Mat dst_kernel_X;
conv2Dsrc, dst_kernel_X, kernel_X); 
conv2Ddst_kernel_X, dst, kernel_Y); 
}
/** * @description: 可分离卷积———先垂直方向卷积,后水平方向卷积 * @param src 输入图像 * @param dst 输出图像 * @param kernel_Y y方向卷积 * @param kernel_X x方向卷积 */
void sepConv2D_Y_Xcv::Mat& src, cv::Mat& dst, cv::Mat kernel_Y, cv::Mat kernel_X)
{ 

cv::Mat dst_kernel_Y;
conv2Dsrc, dst_kernel_Y, kernel_Y); 
conv2Ddst_kernel_Y, dst, kernel_X); 
}
/** * @description: Sobel算子边缘检测 * @param src 输入图像 * @param dst 输出图像 * @param size 掩膜大小 */
void sobelcv::Mat& src, cv::Mat& dst, int size)
{ 

cv::Mat SobelSmoothoper = getSobelSmoothsize); 
cv::Mat Sobeldiffoper = getSobeldiffsize);		
cv::Mat dst_X, dst_Y;
sepConv2D_X_Ysrc, dst_Y, SobelSmoothoper, Sobeldiffoper.t)); 
sepConv2D_Y_Xsrc, dst_X, SobelSmoothoper.t), Sobeldiffoper); 
dst = absdst_X) + absdst_Y);
cv::convertScaleAbsdst, dst);
cv::convertScaleAbsdst_X, dst_X);
cv::convertScaleAbsdst_Y, dst_Y);
}

代码传送门:https://github.com/taifyang/OpenCV-algorithm

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注