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)
上一篇 2022年7月14日 下午5:46
下一篇 2022年7月14日 下午5:46


相关推荐

  • Android debug_Android开发在手机上调试

    Android debug_Android开发在手机上调试AndroidStudio目前已经成为开发Android的主要工具,用熟了可谓相当顺手。作为开发者,调试并发现bug,进而解决,可是我们的看家本领。正所谓,工欲善其事必先利其器,和其他开发工具一样,如Eclipse、Idea,AndroidStudio也为我们提供了强大的调试技巧,今天我们就来看看AndroidStudio中有关调试的技巧。首先,来看看Androidstudio中为我们…

    2022年10月15日
    8
  • 2026全网最全国产OpenClaw盘点:10款主流产品横向测评

    2026全网最全国产OpenClaw盘点:10款主流产品横向测评

    2026年3月16日
    3
  • 学习lodash——这一篇就够用

    学习lodash——这一篇就够用在 ES6 盛行 ES78 马上就要出来的情况下 我们还是需要懂得一些工具库的使用 比较推荐的是 lodash 在下面就会谈一谈为什么要使用 lodash 和 lodash 的基本使用 nbsp 首先要明白的是 lodash 的所有函数都不会在原有的数据上进行操作 而是复制出一个新的数据而不改变原有数据 类似 immutable js 的理念去处理 nbsp lodash 是一套工具库 内部封装了很多字符串 数组 对象

    2026年3月16日
    2
  • 【n8n入门教程01】n8n工作流自动化平台架构解析与核心概念详解

    【n8n入门教程01】n8n工作流自动化平台架构解析与核心概念详解

    2026年3月15日
    3
  • 【记录】前端代码规范 规范

    【记录】前端代码规范 规范1 命名规范 a ClassName 命名 ClassName 的命名应该尽量精短 明确 必须以字母开头命名 且全部字母为小写 单词之间统一使用下划线 连接当子孙模块超过 4 级或以上的时候 可以考虑在祖先模块内具有识辨性的独立缩写作为新的子孙模块 这个时候 tiui 为 tenant info user img 首字母缩写 divclass tenant divclass tenant cover divclass tenant cover divclass tenant

    2026年3月18日
    2
  • 品牌定位策略

    品牌定位策略红罐王老吉品牌定位战略 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 本案例受邀 哈佛商业评论 整理 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 刊于其中文版 2004 年 11 月号品牌释名 nbsp nbsp nbsp nbsp 凉茶是广东 广西地区的一种由中草药熬制 具有清热去湿等功效的 药茶 在众多老字号凉茶中 又以王老吉最为著名 王老吉凉茶发明于清道光年间 至今已有 175 年 被公认为凉茶始祖 有 药茶王 之称 到了近代 王老

    2026年3月19日
    2

发表回复

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

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