代码如下:
#include
int main() {
cv::Mat img = cv::imread("D://My Code/Test_OpenCV/test_2/test1.jpg");
cv::namedWindow("Example_1", cv::WINDOW_AUTOSIZE);
cv::namedWindow("Example_2", cv::WINDOW_AUTOSIZE);
cv::imshow("Example_1", img);
cv::Mat out;
cv::GaussianBlur(img, out, cv::Size(5, 5), 3, 3);
cv::GaussianBlur(out, out, cv::Size(5, 5), 3, 3);
cv::imshow("Example_2", out);
cv::waitKey(0);
}
运行结果如图:
简单介绍一下GaussianBlur()函数
GaussianBlur()函数用高斯滤波器(GaussianFilter)对图像进行平滑处理。
该函数将源图像与指定的高斯内核进行卷积,同时也支持in-place滤波。
斯滤波是通过对输入数组的每个点与输入的高斯滤波模板执行卷积计算然后将这些结果一块组成了滤波后的输出数组,通俗的讲就是高斯滤波是对整幅图像进行加权平均的过程,每一个像素点的值都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
函数如下:
void cv::GaussianBlur(InputArray src, OutputArray dst, Size ksize, double sigmaX,
double sigmaY = 0, int borderType=BORDER_DEFAULT);
函数参数名称 | 参数类型 | 参数含义 |
---|---|---|
src | InputArray | (原始图像:channels不限,各通道单独处理;depth应当是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F) |
dst | OutputArray | (目标图像:与原始图像size和type一致) |
ksize | Size | (高斯核大小,ksize.width和ksize.height可以不同,但是都必须为正的奇数(或者为0,此时它们的值会自动由sigma进行计算)) |
sigmaX | double | (高斯核在x方向的标准差) |
sigmaY | double | (高斯核在y方向的标准差(sigmaY=0时,其值自动由sigmaX确定(sigmaY=sigmaX);sigmaY=sigmaX=0时,它们的值将由ksize.width和ksize.height自动确定) |
borderType | int | (像素外插策略,可参考BorderTypes) |
使用cv::pyrDown()来创建一个新的图像,其宽和高都为原始图像的一半
#include
int main() {
cv::Mat img1, img2;
cv::namedWindow("Example1", cv::WINDOW_AUTOSIZE);
cv::namedWindow("Example2", cv::WINDOW_AUTOSIZE);
img1 = cv::imread("D://My Code/Test_OpenCV/test_2/test1.jpg");
cv::imshow("Example1", img1);
cv::pyrDown(img1, img2);
cv::imshow("Example2", img2);
cv::waitKey(0);
return 0;
}
结果如图:
pyrDown函数
函数原型
void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size());
函数作用
先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半);
通过使用边缘检测器通过cv::cvtcolor()函数生成一个和原图一样大小但是只有一个通道的图像,从而将这个图像的BGR图转换为灰度图,代码如下:
#include
int main() {
cv::Mat img_rgb, img_gry, img_cny;
cv::namedWindow("Example Gray", cv::WINDOW_AUTOSIZE);
cv::namedWindow("Example Canny", cv::WINDOW_AUTOSIZE);
img_rgb = cv::imread("D://My Code/Test_OpenCV/test_2/test1.jpg");
cv::cvtColor(img_rgb, img_gry, cv::COLOR_BGR2GRAY);
cv::imshow("Example Gary", img_gry);
cv::Canny(img_gry, img_cny, 10, 100, 3, true);
cv::imshow("Example Canny", img_cny);
cv::waitKey(0);
return 0;
}
运行结果如图:
cvtcolor函数
函数原型:
void cv::cvtColor(
cv::InputArray src, // 输入序列
cv::OutputArray dst, // 输出序列
int code, // 颜色映射码
int dstCn = 0 // 输出的通道数 (0='automatic')
);
cvtcolor()函数是一个颜色空间转换函数,可以实现RGB颜色向HSV,HSI等颜色空间转换。也可以转换为灰度图。
这里实现了将BGR图像转化为灰度图,定义为宏cv::COLOR_BGR2GRAY
注意,最后一个参数用于制定目标图像的通道数,如果是默认值0,则通道数由输入图像和颜色转换码决定
Canny函数
Canny()函数可以使用canny算法对输入图像进行边缘检测。
函数原型:
void cv::Canny(InputArray image, OutputArray edges, double threshold1, doublt threshold2,
int apertureSize = 3, bool L2gradient = false);
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
image | InputArray | 无 | (输入图像:8-bit) |
edges | OutputArray | 无 | (输出边缘图像:单通道,8-bit,size与输入图像一致) |
threshold1 | double | 无 | (阈值1) |
threshold2 | double | 无 | (阈值2) |
apertureSize | int | 3 | (Sober算子大小) |
L2gradient | bool | false | (是否采用更精确的方式计算图像梯度) |