卷积的用途:
卷积主要用于降噪处理,是降噪处理的一种方式;
二维离散卷积包含高斯滤波,平滑滤波,中值滤波,以及能保证图像边缘的双边滤波和导向滤波算法等;
一、了解噪声的来源以及噪声的分类;
图像中难免会存在噪声,噪声可以简单的理解为灰度值的随机变化,即拍照过程中引入了一些不想要的噪点;
噪声可分为椒盐噪声,高斯噪声,加性噪声和乘性噪声;
若想更了解噪声的来源,可参考噪声系数系列:噪声来源、NF定义及影响 - 知乎
二、卷积又称二维离散卷积
想了解卷积究竟是什么样的概念的话,可参考:
如何通俗易懂地解释卷积? - 知乎
如何通俗易懂地解释卷积? - 知乎
学习图像平滑前,有必要了解下卷积的知识,看完上述连接,对于图像处理中卷积应该了解几个关键词:卷积核,锚点,步长,内积,卷积模式
卷积核(kernel):用来对图像矩阵进行平滑的矩阵,也称为过滤器(filter)
锚点:卷积核和图像矩阵重叠,进行内积运算后,锚点位置的像素点会被计算值取代。一般选取奇数卷积核,其中心点作为锚点
步长:卷积核沿着图像矩阵每次移动的长度
内积:卷积核和图像矩阵对应像素点相乘,然后相加得到一个总和,如下图所示。(不要和矩阵乘法混淆)
#include
#include
#include
#include
#include
using namespace cv;
using namespace std;
RNG rng(12345);
Scalar color[7] = {
(Scalar(0,0,255)),//红色
(Scalar(0,255,0)),//绿色
(Scalar(255,0,0)),//蓝色
(Scalar(255,255,0)),//浅蓝色
(Scalar(255,0,255)),//紫色
(Scalar(0,255,255)),//黄色
(Scalar(128,128,192)),//浅粉色
};
int main()
{
Mat image,gray_img,thread_img,resize_3d_img, resize2_img,dst_img, dst2_img, dst3_img;
image = imread("../warpAffine_3d.jpg", 1);
if (image.empty()) {
cout << "无此图片" << endl;
return 0;
}
cvtColor(image, gray_img,COLOR_RGB2GRAY,0);//将图像转换为灰度图
threshold(gray_img, thread_img, 100, 255, THRESH_BINARY_INV);//将灰度图转换为二值图
Point2f srcM[4],dstM[4];
srcM[0] = Point2f(45, 43);//左上角绿色顶点
srcM[1] = Point2f(219, 39);//右上角绿色顶点
srcM[2] = Point2f(219, 209);//右下角绿色顶点
srcM[3] = Point2f(31, 209);//左下角绿色顶点
dstM[0] = Point2f(0, 0);
dstM[1] = Point2f(300, 0);
dstM[2] = Point2f(300, 300);
dstM[3] = Point2f(0, 300);
Mat t_mat = Mat::zeros(2, 4, CV_32FC1);
while (1)
{
imshow("原图", image);
waitKey(1);
flip(image, dst_img, -1);//0沿着X轴翻转,1沿着Y轴翻转,-1先沿着X轴翻转再沿着Y轴翻转
imshow("3卷积图像", dst_img);
waitKey(1);
t_mat = getPerspectiveTransform(srcM, dstM, 0);
warpPerspective(image, resize_3d_img, t_mat, Size(300, 300), 1, 0, 255);
imshow("3d仿射变换", resize_3d_img);
waitKey(1);
Mat board_mat = (Mat_(3, 3) << -1, -1, -1,
-1, 9, -1,
-1, -1, -1);
filter2D(resize_3d_img, dst2_img, image.depth(), board_mat);
imshow("边缘突出卷积图像", dst2_img);
waitKey(1);
Mat blur_mat = (Mat_(3, 3) << 1.0f / 9, 1.0f / 9, 1.0f / 9,
1.0f / 9, 1.0f / 9, 1.0f / 9,
1.0f / 9, 1.0f / 9, 1.0f / 9);
filter2D(resize_3d_img, dst3_img, image.depth(), blur_mat);
imshow("平滑卷积图像", dst3_img);
waitKey(1);
}
return 1;
}