【OpenCV学习】OpenCV中对图像的简单变换

1.对图像的平滑处理

代码如下:

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

运行结果如图: 

【OpenCV学习】OpenCV中对图像的简单变换_第1张图片

简单介绍一下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)

2.高斯模糊和降采样

使用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;
}

结果如图:

【OpenCV学习】OpenCV中对图像的简单变换_第2张图片

pyrDown函数

函数原型

void pyrDown(InputArray src, OutputArray dst, const Size& dstsize=Size());

函数作用

先对图像进行高斯平滑,然后再进行降采样(将图像尺寸行和列方向缩减一半); 

3.Canny边缘检测器输出一个单通道的(灰度)图像

通过使用边缘检测器通过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;
}

运行结果如图:

【OpenCV学习】OpenCV中对图像的简单变换_第3张图片

 

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 (是否采用更精确的方式计算图像梯度)

 

你可能感兴趣的:(OpenCV学习)