Open_cv中常用函数的原型及参数解释(一)

这里的函数主要总结自浅墨的系列博客,总结仅为了在使用时可以快速检索

具体Demo和教程请访问浅墨的Open_cv系列:访问地址

1、保存图像的数据结构:Mat

Mat myMat= imread("需要导入的图像.jpg"); 

2、图像导入函数:imread

Mat imread(const string& filename, intflags=1 ); 

·第一个参数,const string&类型的filename,填我们需要载入的图片路径名。

Windows操作系统下,OpenCV的imread函数支持如下类型的图像载入:

Windows位图 - *.bmp, *.dib

JPEG文件 - *.jpeg, *.jpg, *.jpe

JPEG 2000文件- *.jp2

PNG图片 - *.png

便携文件格式- *.pbm, *.pgm, *.ppm

Sun rasters光栅文件 - *.sr, *.ras

TIFF 文件 - *.tiff, *.tif

·第二个参数,int类型的flags,为载入标识,它指定一个加载图像的颜色类型。可以看到它自带缺省值1.

(1)  flag>0, 该函数返回3通道图像,如果磁盘上的图像文件是单通道的灰度图像,则会被强制转为3通道;

(2)  flag=0, 该函数返回单通道图像,如果磁盘的图像文件是多通道的则会被强制转为单通道;

(3)  flag<0, 则函数不对图像进行通道转换

3、创建窗口函数:namedWindow

void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE ); 

·第一个参数,const string&型的name,即填被用作窗口的标识符的窗口名称。

·第二个参数,int 类型的flags ,窗口的标识,可以填如下的值:

扫描二维码关注公众号,回复: 890936 查看本文章

A)WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)

B)WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。

C)WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。

4、指定窗口显示图像函数:imshow

void imshow(const string& winname, InputArray mat);

 ·第一个参数,const string&类型的winname,填需要显示的窗口标识名称。

 ·第二个参数,InputArray 类型的mat,填需要显示的图像。

5、输出图像到文件:imwrite函数

bool imwrite(const string& filename,InputArray img, const vector<int>& params=vector<int>() ); 

· 第一个参数,const string&类型的filename,填需要写入的文件名就行了,带上后缀,比如,“123.jpg”这样。

·第二个参数,InputArray类型的img,一般填一个Mat类型的图像数据就行了。

 ·第三个参数,const vector<int>&类型的params,表示为特定格式保存的参数编码,它有默认值vector<int>(),所以一般情况下不需要填写。而如果要填写的话,有下面这些需要了解的地方:

6、设定感兴趣区域:ROI(region of interest)

//设定感兴趣区域案例
//定义一个Mat类型并给其设定ROI区域  
Mat imageROI;  
//方法一  
imageROI=image(Rect(500,250,logo.cols,logo.rows));  
//方法二  
imageROI=srcImage3(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));

7、图像线性混合函数:addWeighted

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);

·第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。

·第二个参数,alpha,表示第一个数组的权重

·第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。

·第四个参数,beta,表示第二个数组的权重值。

·第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。

·第六个参数,gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。

·第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。

8、通道分离函数:split

void split(InputArray m,OutputArrayOfArrays mv);

· 第一个参数,InputArray类型的m或者const Mat&类型的src,填我们需要进行分离的多通道数组。

· 第二个参数,OutputArrayOfArrays类型的mv,填函数的输出数组或者输出的vector容器。

9、通道合并函数 merge

void merge(InputArrayOfArrays mv,OutputArray dst) 

· 第一个参数,mv,填需要被合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。

· 第二个参数,count,当mv为一个空白的C数组时,代表输入矩阵的个数,这个参数显然必须大于1.

· 第三个参数,dst,即输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。

10、分离色彩通道写法:

vector<Mat> channels;    
Mat imageBlueChannel;    //定义蓝色通道容器
Mat imageGreenChannel;    //定义绿色通道容器
Mat imageRedChannel;     //定义红色通道容器
srcImage4= imread("需要分离色彩通道的图片.jpg");  
// 把一个3通道图像转换成3个单通道图像  
split(srcImage4,channels);//分离色彩通道  
imageBlueChannel = channels.at(0);  
imageGreenChannel = channels.at(1);  
imageRedChannel = channels.at(2); 

        根据OpenCV的BGR色彩空间(bule,Green,Red,蓝绿红),其中channels.at(0)就表示引用取出channels中的蓝色分量,channels.at(1)就表示引用取出channels中的绿色色分量,channels.at(2)就表示引用取出channels中的红色分量。

11、创建轨迹条函数:createTrackbar

int createTrackbar(conststring& trackbarname,conststring&winname,int* value, int count, TrackbarCallback onChange=0,void* userdata=0);

· 第一个参数,const string&类型的trackbarname,表示轨迹条的名字,用来代表我们创建的轨迹条。

· 第二个参数,const string&类型的winname,填窗口的名字,表示这个轨迹条会依附到哪个窗口上,即对应namedWindow()创建窗口时填的某一个窗口名。

· 第三个参数,int* 类型的value,一个指向整型的指针,表示滑块的位置。并且在创建时,滑块的初始位置就是该变量当前的值。

· 第四个参数,int类型的count,表示滑块可以达到的最大位置的值。PS:滑块最小的位置的值始终为0。

· 第五个参数,TrackbarCallback类型的onChange,首先注意他有默认值0。这是一个指向回调函数的指针,每次滑块位置改变时,这个函数都会进行回调。并且这个函数的原型必须为void XXXX(int,void*);其中第一个参数是轨迹条的位置,第二个参数是用户数据(看下面的第六个参数)。如果回调是NULL指针,表示没有回调函数的调用,仅第三个参数value有变化。

· 第六个参数,void*类型的userdata,他也有默认值0。这个参数是用户传给回调函数的数据,用来处理轨迹条事件。如果使用的第三个参数value实参是全局变量的话,完全可以不去管这个userdata参数。

12、轨迹条回调函数:getTrackbarPos

int getTrackbarPos(conststring& trackbarname, conststring& winname);

· 第一个参数,const string&类型的trackbarname,表示轨迹条的名字。

· 第二个参数,const string&类型的winname,表示轨迹条的父窗口的名称。

13、访问图像中的每一个像素点:

//三个for循环,执行运算 new_image(i,j) =a*image(i,j) + b  
for(int y = 0; y < image.rows; y++ )  
{  
       for(int x = 0; x < image.cols; x++ )  
       {  
              for(int c = 0; c < 3; c++ )  
              {  
                     new_image.at<Vec3b>(y,x)[c]= saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] ) + g_nBrightValue );  
              }  
       }  
}  
让我们分三个方面进行讲解:
·为了访问图像的每一个像素,我们使用这样的语法: image.at<Vec3b>(y,x)[c] 
·其中,y是像素所在的行, x是像素所在的列, c是R、G、B(对应0、1、2)其中之一。
·因为我们的运算结果可能超出像素取值范围(溢出),还可能是非整数(如果是浮点数的话),所以我们要用saturate_cast对结果进行转换,以确保它为有效值。
·这里的a也就是对比度,一般为了观察的效果,取值为0.0到3.0的浮点值,但是我们的轨迹条一般取值都会整数,所以在这里我们可以,将其代表对比度值的nContrastValue参数设为0到300之间的整型,在最后的式子中乘以一个0.01,这样就可以完成轨迹条中300个不同取值的变化。所以在式子中,我们会看到saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] ) + g_nBrightValue )中的g_nContrastValue*0.01。

14、方框滤波函数:box Filter

void boxFilter(InputArray src,OutputArray dst, int ddepth, Size ksize, Point anchor=Point(-1,-1), boolnormalize=true, int borderType=BORDER_DEFAULT )

· 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。

· 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。

· 第三个参数,int类型的ddepth,输出图像的深度,-1代表使用原图深度,即src.depth()。

· 第四个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小

· 第五个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。

· 第六个参数,bool类型的normalize,默认值为true,一个标识符,表示内核是否被其区域归一化(normalized)了。

· 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

//示例代码
//载入原图  
Mat image=imread("2.jpg");  
//进行均值滤波操作  
Mat out;  
boxFilter(image, out, -1,Size(5, 5)); 

15、均值滤波函数:blur

void blur(InputArray src, OutputArraydst, Size ksize, Point anchor=Point(-1,-1), int borderType=BORDER_DEFAULT ) 

· 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。该函数对通道是独立处理的,且可以处理任意通道数的图片,但需要注意,待处理的图片深度应该为CV_8U, CV_16U, CV_16S, CV_32F 以及 CV_64F之一。

· 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。

· 第三个参数,Size类型(对Size类型稍后有讲解)的ksize,内核的大小。一般这样写Size( w,h )来表示内核的大小( 其中,w 为像素宽度, h为像素高度)。Size(3,3)就表示3x3的核大小,Size(5,5)就表示5x5的核大小

· 第四个参数,Point类型的anchor,表示锚点(即被平滑的那个点),注意他有默认值Point(-1,-1)。如果这个点坐标是负值的话,就表示取核的中心为锚点,所以默认值Point(-1,-1)表示这个锚点在核的中心。

· 第五个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

//示例代码
//载入原图  
  Mat image=imread("1.jpg");  
  //进行均值滤波操作  
  Mat out;  
  blur(image, out, Size(7, 7));  

16、高斯滤波函数:GaussianBlur

void GaussianBlur(InputArray src,OutputArray dst, Size ksize, double sigmaX, double sigmaY=0, intborderType=BORDER_DEFAULT )

· 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。

· 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。

· 第三个参数,Size类型的ksize高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数。或者,它们可以是零的,它们都是由sigma计算而来。

· 第四个参数,double类型的sigmaX,表示高斯核函数在X方向的的标准偏差。

· 第五个参数,double类型的sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。

· 为了结果的正确性着想,最好是把第三个参数Size,第四个参数sigmaX和第五个参数sigmaY全部指定到。

· 第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。有默认值BORDER_DEFAULT,我们一般不去管它。

//示例代码
//载入原图  
Mat image=imread("1.jpg");  
//进行滤波操作  
Mat out;  
GaussianBlur( image, out, Size( 5, 5 ), 0, 0 ); 

17、中值滤波函数:medianBlur

void medianBlur(InputArray src,OutputArray dst, int ksize) 

· 第一个参数,InputArray类型的src,函数的输入参数,填1、3或者4通道的Mat类型的图像;当ksize为3或者5的时候,图像深度需为CV_8U,CV_16U,或CV_32F其中之一,而对于较大孔径尺寸的图片,它只能是CV_8U。

· 第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。我们可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。

· 第三个参数,int类型的ksize,孔径的线性尺寸(aperture linear size),注意这个参数必须是大于1的奇数,比如:3,5,7,9 ...

//示例代码
//载入原图  
Mat image=imread("1.jpg");  
//进行中值滤波操作  
Mat out;  
medianBlur( image, out, 7); 

18、双边滤波函数:bilateralFilter

void bilateralFilter(InputArray src, OutputArraydst, int d, double sigmaColor, double sigmaSpace, int borderType=BORDER_DEFAULT)  

· 第一个参数,InputArray类型的src,输入图像,即源图像,需要为8位或者浮点型单通道、三通道的图像。

· 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。

· 第三个参数,int类型的d,表示在过滤过程中每个像素邻域的直径。如果这个值我们设其为非正数,那么OpenCV会从第五个参数sigmaSpace来计算出它来。

· 第四个参数,double类型的sigmaColor,颜色空间滤波器的sigma值。这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域。

· 第五个参数,double类型的sigmaSpace坐标空间中滤波器的sigma值,坐标空间的标注方差。他的数值越大,意味着越远的像素会相互影响,从而使更大的区域足够相似的颜色获取相同的颜色。当d>0,d指定了邻域大小且与sigmaSpace无关。否则,d正比于sigmaSpace。

· 第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。

//示例代码
//载入原图  
Mat image=imread("1.jpg");  
//进行双边滤波操作  
Mat out;  
bilateralFilter( image, out, 25, 25*2, 25/2 );  

19、形态学膨胀函数:dilate

void dilate(  
    InputArray src,  
    OutputArray dst,  
    InputArray kernel,  
    Point anchor=Point(-1,-1),  
    int iterations=1,  
    int borderType=BORDER_CONSTANT,  
    const Scalar& borderValue=morphologyDefaultBorderValue()   
);  

· 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一。

· 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。

· 第三个参数,InputArray类型的kernel,膨胀操作的核。若为NULL时,表示的是使用参考点位于中心3x3的核。

我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。

其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:

· 矩形: MORPH_RECT

· 交叉形: MORPH_CROSS

· 椭圆形: MORPH_ELLIPSE

getStructuringElement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。

我们一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心。且需要注意,十字形的element形状唯一依赖于锚点的位置。而在其他情况下,锚点只是影响了形态学运算结果的偏移。

//示例代码(膨胀)       
 //载入原图   
        Mat image = imread("1.jpg");  
//获取自定义核  
        Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));  
        Mat out;  
        //进行膨胀操作  
        dilate(image, out, element);  
//示例代码(getStructuringElement)
 int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸  
//获取自定义核  
Mat element = getStructuringElement(MORPH_RECT,  
    Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),  
Point( g_nStructElementSize, g_nStructElementSize )); 

20、形态学腐蚀函数:erode

void erode(  
    InputArray src,  
    OutputArray dst,  
    InputArray kernel,  
    Point anchor=Point(-1,-1),  
    int iterations=1,  
    int borderType=BORDER_CONSTANT,  
    const Scalar& borderValue=morphologyDefaultBorderValue()  
 );  

· 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像通道的数量可以是任意的,但图像深度应为CV_8U,CV_16U,CV_16S,CV_32F或 CV_64F其中之一。

· 第二个参数,OutputArray类型的dst,即目标图像,需要和源图片有一样的尺寸和类型。

· 第三个参数,InputArray类型的kernel,腐蚀操作的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。(具体看上文中浅出部分dilate函数的第三个参数讲解部分)

· 第四个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于单位(element)的中心,我们一般不用管它。

· 第五个参数,int类型的iterations,迭代使用erode()函数的次数,默认值为1。

· 第六个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_DEFAULT。

· 第七个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

//示例代码
//载入原图   
        Mat image = imread("1.jpg");  
//获取自定义核  
        Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));  
        Mat out;  
//进行腐蚀操作  
        erode(image,out, element);  

21、morphologyEx函数详解(开运算、闭运算、顶帽、黑帽、形态学梯度)

void morphologyEx(  
InputArray src,  
OutputArray dst,  
int op,  
InputArraykernel,  
Pointanchor=Point(-1,-1),  
intiterations=1,  
intborderType=BORDER_CONSTANT,  
constScalar& borderValue=morphologyDefaultBorderValue() );  

· 第一个参数,InputArray类型的src,输入图像,即源图像,填Mat类的对象即可。图像位深应该为以下五种之一:CV_8U, CV_16U,CV_16S, CV_32F 或CV_64F。

· 第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。

· 第三个参数,int类型的op,表示形态学运算的类型,可以是如下之一的标识符:

· 

· MORPH_OPEN – 开运算(Opening operation)

· MORPH_CLOSE – 闭运算(Closing operation)

· MORPH_GRADIENT -形态学梯度(Morphological gradient)

· MORPH_TOPHAT - “顶帽”(“Top hat”)

· MORPH_BLACKHAT - “黑帽”(“Black hat“)

另有CV版本的标识符也可选择,如CV_MOP_CLOSE,CV_MOP_GRADIENT,CV_MOP_TOPHAT,CV_MOP_BLACKHAT,这应该是OpenCV1.0系列版本遗留下来的标识符,和上面的“MORPH_OPEN”一样的效果。

 

· 第四个参数,InputArray类型的kernel,形态学运算的内核。若为NULL时,表示的是使用参考点位于中心3x3的核。我们一般使用函数 getStructuringElement配合这个参数的使用。getStructuringElement函数会返回指定形状和尺寸的结构元素(内核矩阵)。关于getStructuringElement我们上篇文章中讲过了,这里为了大家参阅方便,再写一遍:

其中,getStructuringElement函数的第一个参数表示内核的形状,我们可以选择如下三种形状之一:

· 

· 矩形: MORPH_RECT

· 交叉形: MORPH_CROSS

· 椭圆形: MORPH_ELLIPSE

getStructuringElement函数的第二和第三个参数分别是内核的尺寸以及锚点的位置。

我们一般在调用erode以及dilate函数之前,先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置,有默认值Point(-1,-1),表示锚点位于中心。且需要注意,十字形的element形状唯一依赖于锚点的位置。而在其他情况下,锚点只是影响了形态学运算结果的偏移。

· 第五个参数,Point类型的anchor,锚的位置,其有默认值(-1,-1),表示锚位于中心。

· 第六个参数,int类型的iterations,迭代使用函数的次数,默认值为1。

· 第七个参数,int类型的borderType,用于推断图像外部像素的某种边界模式。注意它有默认值BORDER_ CONSTANT。

·第八个参数,const Scalar&类型的borderValue,当边界为常数时的边界值,有默认值morphologyDefaultBorderValue(),一般我们不用去管他。需要用到它时,可以看官方文档中的createMorphologyFilter()函数得到更详细的解释。

//getStructuringElement函数相关的调用示例代码
int g_nStructElementSize = 3; //结构元素(内核矩阵)的尺寸  
   
//获取自定义核  
Mat element =getStructuringElement(MORPH_RECT,  
       Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1),  
       Point(g_nStructElementSize, g_nStructElementSize )); 


//形态学处理示例代码(以开运算为例)
//载入原始图    
       Mat image = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图  
       //创建窗口    
       namedWindow("【原始图】开运算");   
       namedWindow("【效果图】开运算");   
       //显示原始图   
       imshow("【原始图】开运算", image);   
       //定义核  
       Mat element = getStructuringElement(MORPH_RECT, Size(15, 15));   
       //进行形态学操作  
       morphologyEx(image,image, MORPH_OPEN, element);  
       //显示效果图   
       imshow("【效果图】开运算", image);   
   
       waitKey(0);   
   
       return 0;   

22、边缘检测函数:Candy算子

void Canny(InputArray image,OutputArray edges, double threshold1, double threshold2, int apertureSize=3,bool L2gradient=false )

· 第一个参数,InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位图像。

· 第二个参数,OutputArray类型的edges,输出的边缘图,需要和源图片有一样的尺寸和类型。

· 第三个参数,double类型的threshold1,第一个滞后性阈值。

· 第四个参数,double类型的threshold2,第二个滞后性阈值。

· 第五个参数,int类型的apertureSize,表示应用Sobel算子的孔径大小,其有默认值3。

· 第六个参数,bool类型的L2gradient,一个计算图像梯度幅值的标识,有默认值false。

//示例代码
//载入原始图   
       Mat src = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图  
       Canny(src, src, 3, 9,3 );  
       imshow("【效果图】Canny边缘检测", src);  

23、边缘检测函数:sobel算子

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 );  

· 第一个参数,InputArray 类型的src,为输入图像,填Mat类型即可。

· 第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。

· 第三个参数,int类型的ddepth,输出图像的深度,支持如下src.depth()和ddepth的组合:

· 

· 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

· 第四个参数,int类型dx,x 方向上的差分阶数。

· 第五个参数,int类型dy,y方向上的差分阶数。

· 第六个参数,int类型ksize,有默认值3,表示Sobel核的大小;必须取1,3,5或7。

· 第七个参数,double类型的scale,计算导数值时可选的缩放因子,默认值是1,表示默认情况下是没有应用缩放的。我们可以在文档中查阅getDerivKernels的相关介绍,来得到这个参数的更多信息。

· 第八个参数,double类型的delta,表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。

· 第九个参数, int类型的borderType,我们的老朋友了(万年是最后一个参数),边界模式,默认值为BORDER_DEFAULT。这个参数可以在官方文档中borderInterpolate处得到更详细的信息。

//示例代码
 //【0】创建 grad_x 和 grad_y 矩阵  
    Mat grad_x, grad_y;  
    Mat abs_grad_x, abs_grad_y,dst;  
  
    //【1】载入原始图    
    Mat src = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图  
  
    //【2】显示原始图   
    imshow("【原始图】sobel边缘检测", src);   
  
    //【3】求 X方向梯度  
    Sobel( src, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT );  
    convertScaleAbs( grad_x, abs_grad_x );  
    imshow("【效果图】 X方向Sobel", abs_grad_x);   
  
    //【4】求Y方向梯度  
    Sobel( src, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT );  
    convertScaleAbs( grad_y, abs_grad_y );  
    imshow("【效果图】Y方向Sobel", abs_grad_y);   
  
    //【5】合并梯度(近似)  
    addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst );  
    imshow("【效果图】整体方向Sobel", dst); 

24、边缘检测函数:Laplace算子

void Laplacian(InputArray src,OutputArray dst, int ddepth, int ksize=1, double scale=1, double delta=0, intborderType=BORDER_DEFAULT );  

· 第一个参数,InputArray类型的image,输入图像,即源图像,填Mat类的对象即可,且需为单通道8位图像。

· 第二个参数,OutputArray类型的edges,输出的边缘图,需要和源图片有一样的尺寸和通道数。

· 第三个参数,int类型的ddept,目标图像的深度。

· 第四个参数,int类型的ksize,用于计算二阶导数的滤波器的孔径尺寸,大小必须为正奇数,且有默认值1。

· 第五个参数,double类型的scale,计算拉普拉斯值的时候可选的比例因子,有默认值1。

· 第六个参数,double类型的delta,表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。

· 第七个参数, int类型的borderType,边界模式,默认值为BORDER_DEFAULT。这个参数可以在官方文档中borderInterpolate()处得到更详细的信息。

//示例代码
   //【0】变量的定义  
    Mat src,src_gray,dst, abs_dst;  
  
    //【1】载入原始图    
    src = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图  
  
    //【2】显示原始图   
    imshow("【原始图】图像Laplace变换", src);   
  
    //【3】使用高斯滤波消除噪声  
    GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );  
  
    //【4】转换为灰度图  
    cvtColor( src, src_gray, CV_RGB2GRAY );  
  
    //【5】使用Laplace函数  
    Laplacian( src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT );  
  
    //【6】计算绝对值,并将结果转换成8位  
    convertScaleAbs( dst, abs_dst );  
  
    //【7】显示效果图  
    imshow( "【效果图】图像Laplace变换", abs_dst );  

25、边缘检测函数:scharr滤波器

void Scharr(  
InputArray src, //源图  
 OutputArray dst, //目标图  
 int ddepth,//图像深度  
 int dx,// x方向上的差分阶数  
 int dy,//y方向上的差分阶数  
 double scale=1,//缩放因子  
 double delta=0,// delta值  
 intborderType=BORDER_DEFAULT )// 边界模式  

· 第一个参数,InputArray 类型的src,为输入图像,填Mat类型即可。

· 第二个参数,OutputArray类型的dst,即目标图像,函数的输出参数,需要和源图片有一样的尺寸和类型。

· 第三个参数,int类型的ddepth,输出图像的深度,支持如下src.depth()和ddepth的组合:

· 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

· 第四个参数,int类型dx,x方向上的差分阶数。

· 第五个参数,int类型dy,y方向上的差分阶数。

· 第六个参数,double类型的scale,计算导数值时可选的缩放因子,默认值是1,表示默认情况下是没有应用缩放的。我们可以在文档中查阅getDerivKernels的相关介绍,来得到这个参数的更多信息。

· 第七个参数,double类型的delta,表示在结果存入目标图(第二个参数dst)之前可选的delta值,有默认值0。

· 第八个参数, int类型的borderType,我们的老朋友了(万年是最后一个参数),边界模式,默认值为BORDER_DEFAULT。这个参数可以在官方文档中borderInterpolate处得到更详细的信息。

猜你喜欢

转载自blog.csdn.net/qq_15029743/article/details/79922765
今日推荐