OpenCV学习总结
- 基础知识
读取图像 imread功能是加载图像文件成为一个Mat对象,其中第一个参数表示图像文件名称,第二个参数,表示加载的图像是什么类型,支持常见的三个参数值 IMREAD_UNCHANGED(< 0) 表示加载原图,不做任何改变 IMREAD_GRAYSCALE(0)表示把原图作为灰度图像加载进来 IMREAD_COLOR(> 0) 表示把原图作为RGB图像加载进来
图像复制 部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分 Mat A = imread(imgFilePath); Mat B(A) //部分复制 完全复制:如果想把Mat对象的头部和数据部分一起复制,可以通过如下两个API实现 Mat F = A.clone(); 或 Mat G; A.copyTo(G); Mat new_image = Mat::zeros(image.size(), image.type()); 创建一张跟原图像大小和类型一致的空白图像、像素值初始化为0
获取图像基本信息 int channels = image.channels();//图像波段数 int rows = image.rows; int cols = image.cols * channels;
读一个GRAY像素点的像素值(CV_8UC1) Scalar intensity = img.at(y, x); //注意xy 位置 Scalar intensity = img.at(Point(x, y));
读一个RGB像素点的像素值 Vec3f intensity = img.at(y, x); float blue = intensity.val[0]; float green = intensity.val[1]; float red = intensity.val[2];
修改图像像素值 灰度图像 img.at(y, x) = 128; RGB三通道图像 img.at(y,x)[0]=128; // blue img.at(y,x)[1]=128; // green img.at(y,x)[2]=128; // red 空白图像赋值 img = Scalar(0); ROI选择 Rect r(10, 10, 100, 100); Mat smallImg = img?;
- 常用API
//这个函数的功能是确保RGB值得范围在0~255之间 saturate_cast(288)
//将图像转化为位图 灰度或者RGB cvtColor(src, dst, CV_RGBA2BGR);
//自定义卷积函数 Mat kernel = (Mat_(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0); filter2D(src, dst, src.depth(), kernel); //其中src与dst是Mat类型变量、src.depth表示位图深度,有32、24、8等。
图像混合 double alpha = 0.3; addWeighted(src1, (1 - alpha), src2, alpha, 0.0, dest);
金字塔 上采样(cv::pyrUp) – zoom in 放大 降采样 (cv::pyrDown) – zoom out 缩小 pyrUp(Mat src, Mat dst, Size(src.cols2, src.rows2)) //生成的图像是原图在宽与高各放大两倍 pyrDown(Mat src, Mat dst, Size(src.cols/2, src.rows/2)) //生成的图像是原图在宽与高各缩小1/2
图像二值化 凸包检测 凸包检测判断是否左转,如果左转则删掉。 霍夫检测 霍夫直线变换原理,检测直线前提是边缘检测已经完成,角度不断变化会绘制出一条线,每个像素值都可以绘制出一条线,如果出现一定数量的交点检测出直线; 霍夫圆检测原理,已知XY控制R如果角度在0-360度变化如果交点比较多则认为是圆,有点像反向投影通过多个圆绘制交点;
- 平滑算子
均值模糊 blur(Mat src, Mat dst, Size(xradius, yradius), Point(-1,-1)); 特点:均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。 中值模糊 medianBlur(Mat src, Mat dest, ksize) 特点:中值滤波对脉冲噪声有良好的滤除作用,特别是在滤除噪声的同时,能够保护信号的边缘,使之不被模糊。中值对椒盐噪声有很好的抑制作用。 高斯模糊 GaussianBlur(Mat src, Mat dst, Size(11, 11), sigmax, sigmay); 其中Size(x, y), x, y 必须是正数而且是奇数 特点:图像大多数噪声均属于高斯噪声,因此高斯滤波器应用也较广泛。高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像去噪。 双边模糊 bilateralFilter(src, dest, d=15, 150, 3); 特点:高斯双边模糊是边缘保留的滤波方法,避免了边缘信息丢失,保留了图像轮廓不变。 参考:https://blog.csdn.net/fan1102958151/article/details/106980216 计算点到多边形的距离pointPolygonTest;
- 形态学操作
膨胀和腐蚀是相对当背景色为黑色,物体为白色,膨胀时白色膨胀; 开运算是先腐蚀后膨胀,其作用是:分离物体,消除小区域。特点:消除噪点,去除小的干扰块,而不影响原来的图像。 闭运算与开运算相反,是先膨胀后腐蚀,作用是消除/“闭合”物体里面的孔洞,特点:可以填充闭合区域。 顶帽操作:原图像与“开运算“的结果图之差;因为开运算带来的结果是放大了裂缝或者局部低亮度的区域,因此,从原图中减去开运算后的图,得到的效果图突出了比原图轮廓周围的区域更明亮的区域,且这一操作和选择的核的大小相关。 黑帽运算后的效果图突出了比原图轮廓周围的区域更暗的区域,且这一操作和选择的核的大小相关。 黑帽运算用来分离比邻近点暗一些的斑块。 积分图查找表 积分图查找表是将计算值进行累加然后通过计算右下角+左上角-右上角-左下角的值来计算当前像素点的累加和。
- 距离变换与分水岭变换步骤
/第一步:将白色背景变成黑色-目的是为后面的变换做准备/ /第二步:使用filter2D与拉普拉斯算子实现图像对比度提高,sharp锐化拉普拉斯得到图像边缘用原图减去边缘,差值更大,图像得到锐化,为图像二值化做准备/ /第三步:转为二值图像通过threshold/ /第四步:距离变换/ /第六步:使用阈值,再次二值化,得到标记/ /第七步:腐蚀得到每个Peak - erode/ /第八步:发现轮廓 – findContours/ /第九步:绘制轮廓- drawContours/ /第十步:分水岭变换 watershed/
- 提取边缘算法
1.Sobel与Scharr算子2.Laplance算子3.Canny边缘检测; Sobel与Scharr算子通过计算XY的像素值差异来提取边缘,Laplance算子通过计算二阶导数来提取边缘,但是对噪声比较敏感所以可以先使用高斯滤波去除噪声,Canny边缘检测使用算子计算出边缘并通过非最大值抑制和双阈值限制来优化结果;
- 待更新
轮廓发现函数并绘制 直方图比较方法 匹配算法:1.直方图反投影算法2.模板匹配算法3.计算图像矩; 提取特征点算法:1.Harris角点检测2.Shi-Tomasi角点检测3.自定义角点检测器4.SURF特征检测5.SIFT特征检测6.HOG特征提取7.LBP局本特征提取8.Haar特征检测9.AKAZE局部匹配10.Brisk特征检测与匹配; 特征点匹配算法:1.Brute-Force匹配,2.FLANN快速特征匹配
|