参考博文:
https://blog.csdn.net/godadream/article/details/81568844
高斯模糊
数字图像处理中,高斯滤波主要可以使用两种方法实现。一种是离散化窗口滑窗卷积,另一种方法是通过傅里叶变化。最常见的就是滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常搭的情况下,可能会考虑基于傅里叶变化的实现方法。高斯模板是通过高斯函数计算出来的。
高斯滤波模板中最重要的参数就是高斯分布的标准差σ。它代表着数据的离散程度,如果σ较小,那么生成的模板中心系数越大,而周围的系数越小,这样对图像的平滑效果就不是很明显;相反,σ较大时,则生成的模板的各个系数相差就不是很大,比较类似于均值模板,对图像的平滑效果就比较明显。通过下面的一维高斯分布图也可验证上述观点。
参数详解如下:
src,输入图像,即源图像,填Mat类的对象即可。它可以是单独的任意通道数的图片,但需要注意,图片深度应该为CV_8U,CV_16U, CV_16S, CV_32F 以及 CV_64F之一。
dst,即目标图像,需要和源图片有一样的尺寸和类型。比如可以用Mat::Clone,以源图片为模板,来初始化得到如假包换的目标图。
ksize,高斯内核的大小。其中ksize.width和ksize.height可以不同,但他们都必须为正数和奇数(并不能理解)。或者,它们可以是零的,它们都是由sigma计算而来。
sigmaX,表示高斯核函数在X方向的的标准偏差。
sigmaY,表示高斯核函数在Y方向的的标准偏差。若sigmaY为零,就将它设为sigmaX,如果sigmaX和sigmaY都是0,那么就由ksize.width和ksize.height计算出来。
例如:
cv::GaussianBlur(img, out, cv::Size(5, 5), 3, 3);
Canny边缘检测
T1, T2为阈值,凡是高于T2的都保留,凡是小于T1都丢弃,从高于T2的像素出发,凡是大于T1而且相互连接的,都保留。最终得到一个输出二值图像。
推荐的高低阈值比值为 T2: T1 = 3:1/2:1其中T2为高阈值,T1为低阈值。
API:
默认情况一般选择是L1,参数设置为false。
一张彩色图像输入进来,Canny检测流程:
#include<opencv2/opencv.hpp>
#include<iostream>
#include <opencv2\imgproc\types_c.h>
using namespace cv;
using namespace std;
int main()
{
Mat photo = imread("1.jpg");
Mat grayImage;
cvtColor(photo, grayImage, CV_BGR2GRAY); //转化为灰度图
GaussianBlur(grayImage, grayImage, cv::Size(7, 7), 2, 2); //高斯模糊
Mat edge_image;
//使用canny检测出边缘
Canny(grayImage, edge_image, 20, 100, 3,false);
namedWindow("edge_image", WINDOW_GUI_NORMAL);
imshow("edge_image", edge_image);
waitKey(0);
return 0;
}
结果图: