系统学习图像算法Day.10——OpenCV学习——满水填充、图像金字塔、图像缩小放大、阈值化、边缘检测、霍夫变换(识别直线、圆)

满水填充

定义:是一种用特定的颜色填充连通区域,通过设置可连通像素的上下线以及连通方式来达到不同的填充效果的方法。——简单讲就是:自动选择了和种子点相连的区域,接着将该区域替换成指定的颜色。
函数:floodFill(输入图像、种子点、填充颜色、矩阵、观察元素值与待加入元素值得正最大值、观察元素值与待加入元素值得负最大值)
调用举例:

Mat src = imread("1.jpg"); 
 imshow("【原始图】",src);
 Rect ccomp;
 floodFill(src, Point(100,300), Scalar(155, 255,55), &ccomp, Scalar(20, 20, 20),Scalar(20, 20, 20));
 imshow("【效果图】",src);

图像金字塔

系统学习图像算法Day.10——OpenCV学习——满水填充、图像金字塔、图像缩小放大、阈值化、边缘检测、霍夫变换(识别直线、圆)_第1张图片
如上图越往上图片越小,即分辨率越低。
类型:高斯金字塔、拉普拉斯金字塔
高斯金字塔:用来向下降采样图像,即降低分辨率
拉普拉斯金字塔:向上采样图形,即增加分辨率
函数工具:pyrUp、pyrDown
pyrUp——增加分辨率
pyrDown——降低分辨率
注意不可逆问题

尺寸调整

函数:resize
调用举例:
方法一:resize( srcImage, dstImage, Size(), 0.5, 0.5 ); //其中的0.5便是缩放的比例
方法二:resize( srcImage, dstImage, Size(600,800));

函数:pyrUp、pyrDown
调用举例:
pyrUp( srcImage, dstImage, Size(srcImage.cols2,srcImage.rows2))
pyrDown( srcImage, dstImage, Size(srcImage.cols0.5,srcImage.rows0.5))

阈值化

定义:阈值可以被视为最简单的图像分割方法。基本思想:给定一个数组和一个阈值,然后根据数组中的每个元素的值是高于还是低于阈值而进行一些处理。
函数:Threshold
调用示例:
Threshold( inputImage, dst, thresholdValue, maxval, type )
//其中thresholdValue即阈值, maxval在第一类和第二类中的参数, type即阈值类型

边缘检测

不用多说,就是边缘检测啦
四种类型:canny算子、sobel算子、Laplacian算子、scharr滤波器

函数:canny
Canny( src, dst, 3, 9, 3 )
函数:sobel

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

函数:Laplacian

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

函数:Scharr

Mat src = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图
 //【2】显示原始图 
 imshow("【原始图】Scharr滤波器", src); 
 //【3】求 X方向梯度
 Scharr( src, grad_x, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT );
 convertScaleAbs( grad_x, abs_grad_x );
 imshow("【效果图】 X方向Scharr", abs_grad_x); 
 //【4】求Y方向梯度
 Scharr( src, grad_y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT );
 convertScaleAbs( grad_y, abs_grad_y );
 imshow("【效果图】Y方向Scharr", abs_grad_y); 
 //【5】合并梯度(近似)
 addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst );
 //【6】显示效果图
 imshow("【效果图】合并梯度后Scharr", dst); 

霍夫变换

霍夫变换是图像处理的一种特征提取技术。简单的讲就是:识别图像中的直线与原型
种类:标准霍夫变换、多尺度霍夫变换、累计概率霍夫变换
原理:略
识别直线函数:HoughLines、HoughLinesP
HoughLines调用举例:

 Mat srcImage = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图
 Mat midImage,dstImage;//临时变量和目标图的定义
 //【2】进行边缘检测和转化为灰度图
 Canny(srcImage, midImage, 50, 200, 3);//进行一此canny边缘检测
 cvtColor(midImage,dstImage, CV_GRAY2BGR);//转化边缘检测后的图为灰度图
 //【3】进行霍夫线变换
 vector lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
 HoughLines(midImage, lines, 1, CV_PI/180, 150, 0, 0 );
 //【4】依次在图中绘制出每条线段
 for( size_t i = 0; i < lines.size(); i++ )
 {
  float rho = lines[i][0], theta = lines[i][1];
  Point pt1, pt2;
  double a = cos(theta), b = sin(theta);
  double x0 = a*rho, y0 = b*rho;
  pt1.x = cvRound(x0 + 1000*(-b));
  pt1.y = cvRound(y0 + 1000*(a));
  pt2.x = cvRound(x0 - 1000*(-b));
  pt2.y = cvRound(y0 - 1000*(a));
  line( dstImage, pt1, pt2, Scalar(55,100,195), 1, CV_AA);
 }
 //【5】显示原始图  
 imshow("【原始图】", srcImage);  
 //【6】边缘检测后的图 
 imshow("【边缘检测后的图】", midImage);  
 //【7】显示效果图  
 imshow("【效果图】", dstImage);  

识别圆函数:HoughCircles()
调用举例:

 Mat srcImage = imread("1.jpg");  //工程目录下应该有一张名为1.jpg的素材图
 Mat midImage,dstImage;//临时变量和目标图的定义
 //【2】显示原始图
 imshow("【原始图】", srcImage);  
 //【3】转为灰度图并进行图像平滑
 cvtColor(srcImage,midImage, CV_BGR2GRAY);//转化边缘检测后的图为灰度图
 GaussianBlur( midImage, midImage, Size(9, 9), 2, 2 );
 //【4】进行霍夫圆变换
 vector circles;
 HoughCircles( midImage, circles, CV_HOUGH_GRADIENT,1.5, 10, 200, 100, 0, 0 );
 //【5】依次在图中绘制出圆
 for( size_t i = 0; i < circles.size(); i++ )
 {
  //参数定义
  Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
  int radius = cvRound(circles[i][2]);
  //绘制圆心
  circle( srcImage, center, 3, Scalar(0,255,0), -1, 8, 0 );
  //绘制圆轮廓
  circle( srcImage, center, radius, Scalar(155,50,255), 3, 8, 0 );
 }
 //【6】显示效果图  
 imshow("【效果图】", srcImage);  

晚上睡觉

你可能感兴趣的:(系统学习图像算法Day.10——OpenCV学习——满水填充、图像金字塔、图像缩小放大、阈值化、边缘检测、霍夫变换(识别直线、圆))