OpenCV 学习(利用滤波器进行边缘提取)
2015-09-25 14:13
579 查看
OpenCV 学习(利用滤波器进行边缘提取)
通过低通滤波器,我们可以将图像平滑,相反的,利用高通滤波器可以提取出图像的边缘。Sobel 滤波器
Sobel 滤波器是一种有方向性的滤波器,可以作用在 X 方向或 Y 方向。关于这种滤波器的理论介绍可以参考:
https://en.wikipedia.org/wiki/Sobel_operator
函数原型如下:
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 );
这个滤波器结合了高斯平滑滤波和差分运算,对噪声不是很敏感,是一种很常用的边缘检测算子。 dx 和 dy 是 X 和 Y 方向差分运算的阶数。
如果对 X 方向求1 阶差分,这对参数设为 1, 0。 对 Y 方向则设为 0, 1。
ksize 是核的大小,只能为 1, 3, 5, 7。 ksize = 1 时核为 1行3列或 3行1列,这时高斯平滑的步骤就没有了。
ksize 还可以设为 CV_SCHARR (-1),这算是个隐藏功能。 这时实际上计算的是 3 * 3 Scharr 滤波器。
scale 是对计算结果的缩放,delta 是对计算结果的平移。
下面是一个例子,原始测试图像如下:
这里我们对 X 方向进行边缘检测。因为计算结果会出现负数,所以还做了些放缩和平移操作。代码如下:
cv::Sobel(image, result, CV_8U, 1, 0, 3, 0.5, 128);
处理后的图像如下:
可以看到图像X方向的正负边缘都检测出来了,并且正负边缘的数值是不同的,这对于我们需要提取某一种特定边缘时是很有利的。
如果我们不需要区分正负边缘,可以取个绝对值运算。类似下面这样。
cv::Sobel(image, result, CV_16S, 1, 0, 3); result = abs(result); result.convertTo(result, CV_8U);
这里需要注意的是,当 image 是 CV_8U 类型时,result 类型不能是 CV_8S。这里只能先转成 CV_16S 然后再转换为我们需要的 CV_8U。
分别对图像的 X 方向和 Y 方向进行 Sobel 滤波后我们就得到了图像的梯度信息。但是这个梯度信息是(X, Y)形式的。有时我们需要用到 (ρ,θ)(\rho, \theta) 形式。这时可以用 cv::cartToPolar 函数来进行转换。下面是个例子:
cv::Sobel(image, resultX, CV_32F, 1, 0, 3); cv::Sobel(image, resultY, CV_32F, 0, 1, 3); cv::Mat norm, dir; cv::cartToPolar(resultX, resultY, norm, dir);
Scharr 滤波器
Scharr 算子在图像的梯度方向的计算方面比 Sobel 算子更准确一些。用法和 Sobel 算子是类似的。具体的理论也可以参考:
https://en.wikipedia.org/wiki/Sobel_operator
下面是 Scharr 算子的函数原型。
void Scharr( InputArray src, OutputArray dst, int ddepth, int dx, int dy, double scale=1, double delta=0, int borderType=BORDER_DEFAULT );
简单的说:
Scharr(src, dst, ddepth, dx, dy, scale, delta, borderType);
等效于:
Sobel(src, dst, ddepth, dx, dy, CV_SCHARR, scale, delta, borderType);
相关文章推荐
- Parallels Desktop 一流的Mac虚拟机
- PHP网站建设的流程与步骤分享
- nginx + tomcat 集群实现负载均衡
- Target runtime Apache Tomcat v7.0 is not defined.
- linux(php)
- Linux应用总结(1):自动删除n天前日志
- Beginner’s Guide nginx初学者手册
- eval用法 【shell】
- Linux GCC常用命令
- linux服务进程管理
- linux之route命令
- OpenCV 学习(几种基本的低通滤波)
- OpenCV 学习(几种基本的低通滤波)
- org.apache.catalina.core.StandardWrapperValve invoke
- 每天一个linux命令目录
- linux进程管理
- Error occured processing XML 'org/aopalliance/aop/Advice'
- Nginx+Tomcat7+Mencached负载均衡集群部署笔记
- 用vbs等实现辅助网站的后台运行工作进程(三)
- 「两」创建一个带 ssh 镜座服务(修订版)--采用 Dockerfile 创