您的位置:首页 > 其它

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提取图像边缘,代码如下

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: