OpenCV入门
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
OpenCV用C++语言编写,它的主要接口也是C++语言,但是依然保留了大量的C语言接口。该库也有大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。这些语言的API接口函数可以通过在线文档获得。如今也提供对于C#、Ch、Ruby,GO的支持。
配置OpenCV环境
OpenCV配置方法参考另一篇博主的文章 openCV 3 与vs2017 环境配置
我使用的是OpenCV 3 与 vs2017的组合
OpenCV
本文使用的是c++语言
先做一个小测试输出原图的灰度图像
include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
#define PI 3.1415926
Mat src = imread("C:/Users/hdc/Desktop/icon1.jpg", 1);
cvtColor(src, src, COLOR_BGR2GRAY);
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
waitKey(0);
用基础思路来写高斯模糊,先介绍一下最基本的思路: 卷积!!!!!!!
卷积 Convolution
具体内容参考:https://blog.csdn.net/xylin1012/article/details/81807553
下面开始写高斯模糊
自己实现5X5卷积核
include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
#define PI 3.1415926
Mat src = imread("C:/Users/hdc/Desktop/icon1.jpg", 1);
cvtColor(src, src, COLOR_BGR2GRAY);
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
//5X5卷积模板
Mat model = Mat(5, 5, CV_64FC1);
double sigma = 80;
for (int i = -2; i <= 2; i++) {
for (int j = -2; j <= 2; j++) {
model.at<double>(i + 2, j + 2) = exp(-(i*i + j * j) / (2 * sigma*sigma)) / (2 * PI *sigma*sigma);
}
}
double gaussSum = 0;
gaussSum = sum(model).val[0];
//卷积核的和
for (int i = 0; i < model.rows; i++) {
for (int j = 0; j < 5; j++) {
model.at<double>(i, j) = model.at<double>(i, j) / gaussSum;
}
}
Mat dst = Mat(src.rows - 4, src.cols - 4, CV_8UC1);
for (int i = 2; i < src.rows - 2; i++) {
for (int j = 2; j < src.cols - 2; j++) {
double sum = 0;
for (int m = 0; m < model.rows; m++) {
for (int n = 0; n < model.cols; n++) {
sum += (double)src.at<uchar>(i + m - 2, j + n - 2)*model.at<double>(m, n);
}
}
dst.at<uchar>(i - 2, j - 2) = (uchar)sum;
}
}
namedWindow("gaussBlur", WINDOW_AUTOSIZE);
imshow("asd", dst);
waitKey(0);
效果图
OpenCV中封装了很多函数来实现各种需求,同样也封装了高斯模糊的函数
include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
#define PI 3.1415926
Mat src = imread("C:/Users/hdc/Desktop/icon1.jpg", 1);
cvtColor(src, src, COLOR_BGR2GRAY);
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
Mat dst = src.clone();
GaussianBlur(src, dst, Size(15, 15), 180);
namedWindow("gaussBlur", WINDOW_AUTOSIZE);
imshow("asd", dst);
waitKey(0);
效果图:
可以通过卷积核的大小和卷积核的种类来调整高斯模糊的程度
拓展:卷积及卷积算子(convolution)