sobel和laplace算子
2015-08-17 15:00
405 查看
一、filter2D:
由Filter2D的名字就可以很容易判断出,这个函数是对2D图像做滤波用的函数原型:
C++: void filter2D(InputArray src, OutputArraydst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT )
参数说明:输出图像的图像深度,如果说这个是负值的话,那么输出图像的像素深度将和输入图像一样。当然,输出图像的像素深度也可以自定义,不过必须不能低于输入图像的像素深度。自定义输出图像的取值方式如下:
src.depth() = CV_8U,
ddepth = -1/CV_16S/CV_32F/CV_64F
src.depth() = CV_16U/CV_16S,
ddepth = -1/CV_32F/CV_64F
src.depth() = CV_32F,
ddepth = -1/CV_32F/CV_64F
src.depth() = CV_64F,
ddepth = -1/CV_64F
kerner 卷积核,一个单通道浮点矩阵,注意,必须是浮点型的,如果不是浮点型也会被强制转换为浮点型。如果说想对源图像各个图像通道分别滤波,那么就需要使用函数split()将原始图像先分解到各个图像通道,然后在分别处理。filter2D这个函数可以应用在任意一个线性滤波中,至于边界的处理方式,就不用在意这个细节了。卷积核的大小不可以超过11×11
二、 convertT0
函数原型:void Mat::convertTo( Mat& m, int rtype, double alpha=1, double beta=0 )const;
输入参数:
m 目标矩阵。如果m的大小与原矩阵不一样,或者数据类型与参数不匹配,那么在函数convertTo内部会先给m重新分配空间。
rtype 指定从原矩阵进行转换后的数据类型,即目标矩阵m的数据类型。当然,矩阵m的通道数应该与原矩阵一样的。如果rtype是负数,那么m矩阵的数据类型应该与原矩阵一样。
alpha 缩放因子。默认值是1。即把原矩阵中的每一个元素都乘以alpha。
beta 增量。默认值是0。即把原矩阵中的每一个元素都乘以alpha,再加上beta。
功能:把一个矩阵从一种数据类型转换到另一种数据类型,同时可以带上缩放因子和增量,公式如下:
m(x,y)=saturate_cast(alpha*(*this)(x,y)+beta);
由于有数据类型的转换,所以需要用saturate_cast来处理数据的溢出。
三、使用sobel和laplace提取图像边缘,代码如下
由Filter2D的名字就可以很容易判断出,这个函数是对2D图像做滤波用的函数原型:
C++: void filter2D(InputArray src, OutputArraydst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT )
参数说明:输出图像的图像深度,如果说这个是负值的话,那么输出图像的像素深度将和输入图像一样。当然,输出图像的像素深度也可以自定义,不过必须不能低于输入图像的像素深度。自定义输出图像的取值方式如下:
src.depth() = CV_8U,
ddepth = -1/CV_16S/CV_32F/CV_64F
src.depth() = CV_16U/CV_16S,
ddepth = -1/CV_32F/CV_64F
src.depth() = CV_32F,
ddepth = -1/CV_32F/CV_64F
src.depth() = CV_64F,
ddepth = -1/CV_64F
kerner 卷积核,一个单通道浮点矩阵,注意,必须是浮点型的,如果不是浮点型也会被强制转换为浮点型。如果说想对源图像各个图像通道分别滤波,那么就需要使用函数split()将原始图像先分解到各个图像通道,然后在分别处理。filter2D这个函数可以应用在任意一个线性滤波中,至于边界的处理方式,就不用在意这个细节了。卷积核的大小不可以超过11×11
二、 convertT0
函数原型:void Mat::convertTo( Mat& m, int rtype, double alpha=1, double beta=0 )const;
输入参数:
m 目标矩阵。如果m的大小与原矩阵不一样,或者数据类型与参数不匹配,那么在函数convertTo内部会先给m重新分配空间。
rtype 指定从原矩阵进行转换后的数据类型,即目标矩阵m的数据类型。当然,矩阵m的通道数应该与原矩阵一样的。如果rtype是负数,那么m矩阵的数据类型应该与原矩阵一样。
alpha 缩放因子。默认值是1。即把原矩阵中的每一个元素都乘以alpha。
beta 增量。默认值是0。即把原矩阵中的每一个元素都乘以alpha,再加上beta。
功能:把一个矩阵从一种数据类型转换到另一种数据类型,同时可以带上缩放因子和增量,公式如下:
m(x,y)=saturate_cast(alpha*(*this)(x,y)+beta);
由于有数据类型的转换,所以需要用saturate_cast来处理数据的溢出。
三、使用sobel和laplace提取图像边缘,代码如下
#include<opencv2\opencv.hpp> #include<core\core.hpp> #include<imgproc\imgproc.hpp> #include<highgui\highgui.hpp> #include<iostream> using namespace std; using namespace cv; int main(){ Mat image=imread("F:\\opencv_test\\2.jpg",0); namedWindow("original",0); imshow("original",image); Mat grad_x,grad_y,sobel; Sobel(image,grad_x,CV_16S,1,0); Sobel(image,grad_y,CV_16S,0,1); sobel=grad_x+grad_y; convertScaleAbs(sobel,sobel); namedWindow("sobel",0); imshow("sobel",sobel); //下面使用sobel的方式比上面的效果要好 Mat grad_x2,absgrad_x,grad_y2,absgrad_y,sobel2; Sobel(image,grad_x2,CV_32F,1,0); convertScaleAbs(grad_x2,absgrad_x); namedWindow("sobel x",0); imshow("sobel x",absgrad_x); Sobel(image,grad_y2,CV_32F,0,1); convertScaleAbs(grad_y2,absgrad_y); namedWindow("sobel y",0); imshow("sobel y",absgrad_y); sobel2=absgrad_x+absgrad_y; namedWindow("sobel2",0); imshow("sobel2",sobel2); Mat laplaceImage,laplaceImage2; Laplacian(image,laplaceImage,CV_32F,3); convertScaleAbs(laplaceImage,laplaceImage2); namedWindow("laplace image",0); imshow("laplace image",laplaceImage2); waitKey(0); return 0; }
相关文章推荐
- iOS自动检查更新
- 获取spring容器,以访问容器中定义的其他bean
- 当前窗口的高和宽
- oc 类的使用
- java 反射
- Android 开发之 SimpleTagImageView自定义ImageView
- iOS开发系列--地图与定位
- windows下C语言枚举串口端口
- Lowest Bit
- Ubuntu 14.04下SublimeText 3支持中文输入法
- Installing the PHP/MongoDB extension on Mac OSX 10.8
- 序列合并求前K小项 POJ2442
- Knockout.js Style绑定
- 【转】Maven最佳实践:划分模块
- JavaBean对象转map
- 安卓学习笔记(一)自定义控件2
- java代码执行顺序
- HDU 4121 Xiangqi 模拟
- SAP 金税接口介绍
- ajax日期参数格式问题