sobel算子实现

sobel算子实现原理:实现://阶乘intfactorial(intn){ intfac=1; if(n==0) returnfac; for(inti=1;i<=n;++i) fac*=i; returnfac;}//获得Sobel平滑算子MatgetSobelSmooth(intsize){ intn=size-1; MatSobelSmoothoper=Mat::zeros(size,1,CV_32F); fo

大家好,又见面了,我是你们的朋友全栈君。

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

/** * @description: 计算阶乘 * @param n 自然数 * @return 阶乘 */
int factorial(int 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 getSobelSmooth(int size)
{ 
   
	int n = size - 1;
    cv::Mat SobelSmoothoper = cv::Mat::zeros(size, 1, CV_32F);
	for (int k = 0; k <= n; k++)
	{ 
   
		float *pt = SobelSmoothoper.ptr<float>(0);
		pt[k] = factorial(n) / (factorial(k)*factorial(n - k));
	}
	return SobelSmoothoper;
}

/** * @description: 获得Sobel差分算子 * @param size 掩膜大小 * @return Sobel差分算子 */
cv::Mat getSobeldiff(int size)
{ 
   
    cv::Mat Sobeldiffoper = cv::Mat::zeros(cv::Size(size, 1), CV_32F);
    cv::Mat SobelSmooth = getSobelSmooth(size - 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 conv2D(cv::Mat& src, cv::Mat& dst, cv::Mat kernel)
{ 
   
    cv::flip(kernel, kernel, -1);
    cv::filter2D(src, dst, src.depth(), kernel);
}

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

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

/** * @description: Sobel算子边缘检测 * @param src 输入图像 * @param dst 输出图像 * @param size 掩膜大小 */
void sobel(cv::Mat& src, cv::Mat& dst, int size)
{ 
   
	cv::Mat SobelSmoothoper = getSobelSmooth(size); 
	cv::Mat Sobeldiffoper = getSobeldiff(size);		
	cv::Mat dst_X, dst_Y;
	
	sepConv2D_X_Y(src, dst_Y, SobelSmoothoper, Sobeldiffoper.t()); 
	sepConv2D_Y_X(src, dst_X, SobelSmoothoper.t(), Sobeldiffoper); 

	dst = abs(dst_X) + abs(dst_Y);
	cv::convertScaleAbs(dst, dst);
	cv::convertScaleAbs(dst_X, dst_X);
	cv::convertScaleAbs(dst_Y, dst_Y);
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/158976.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Softmax函数求导

    Softmax函数求导来源:https://blog.csdn.net/zt_1995/article/details/62227603其实整个推导,上面这个图片已经介绍得十分清楚了,但是仍有很多小步骤被省略掉了,我会补上详细的softmax求导的过程:…

    2025年6月2日
    5
  • 面向新手的Web服务器搭建(一)——IIS的搭建[通俗易懂]

    面向新手的Web服务器搭建(一)——IIS的搭建[通俗易懂]很多童鞋说自己是做移动开发的,想挂个简单的WebAPI,可是服务器又不会搭,这样一来测试就成了问题。看看网上的教程,发现略难懂,而且大多是一个转一个,没价值,所以干脆写几篇文章讲讲简单的Web服务器怎么搭,让不太涉及Web的童鞋快速上手。

    2022年5月8日
    89
  • jQuery官网下载步骤[通俗易懂]

    jQuery官网下载步骤[通俗易懂][转载出处](https://blog.csdn.net/u011870547/article/details/50033113)[原文作者](https://blog.csdn.net/u011870547)①.百度jQuery,进入官网②.进入官网后,点击下载③.之后进入下载页面,会看到有各种版本,解压版和未…

    2022年6月3日
    43
  • pycharm2021.11.2激活码(注册激活)

    (pycharm2021.11.2激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0E14HXZ4QL-eyJsaWN…

    2022年3月29日
    39
  • 数据库二级映射是什么_内存映射技术

    数据库二级映射是什么_内存映射技术1.     概述LMDBiscompact(紧凑的),fast,powerful,androbustandimplementsasimplifiedvariantoftheBerkeleyDB(BDB)API.(BDBisalsoverypowerful,andverboselydocumentedinitsownright.)Afterre…

    2022年9月28日
    4
  • css left right_leftorright什么意思

    css left right_leftorright什么意思零、说点什么好久没更新了。并不是在折腾什么大作,而是广度学习与实践中,加上婚礼等诸多大事,所以产出较少。今天这篇也只是小作,博客是自己很好的学习工具,只要我学习不止,博客也会不断更新的。我们平时一般都使用clear:both清除浮动,貌似就干这一件事件。用得很开心,但似乎理解上懵懵懂懂,我其实也是,早年的时候,测试过CSS clear:left/right,虽知其作用(

    2025年10月27日
    3

发表回复

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

关注全栈程序员社区公众号