图像滤波,即在尽量保留图像细节特征的条件下对目标图像的噪声进行抑制。
由于成像系统、传输介质和记录设备等的不完善,数字图像在其形成、传输记录过程中往往会受到多种噪声的污染。这些噪声在图像上常表现为一引起较强视觉效果的孤立像素点或像素块。对于数字图像信号,噪声表为或大或小的极值,这些极值通过加减作用于图像像素的真实灰度值上,对图像造成亮、暗点干扰,极大降低了图像质量,影响图像复原、分割、特征提取、图像识别等后继工作的进行。
将图像的像素点视为一个单元,构成矩阵。以同一行的三个单元为一树组(A)。
a[0]a[1]a[2]分别对应-101并与之相乘后求和
将结果赋值给a[1]
随后将A不断后移直至a[2]为最后一个像素点。
#include <opencv2/opencv.hpp>
#define PI 3.1415926
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
Mat src = imread("F:/private/photo/women.jpg", 1);
//载入原始图像
cvtColor(src, src, COLOR_BGR2GRAY);
//将图像转化为灰度图像
namedWindow("src", WINDOW_AUTOSIZE);
//窗口命名
imshow("src", src);
//输出
Mat dImg = Mat(src.rows, src.cols - 2, CV_8UC1);
//创建一个和原始图像src高和宽一致的8位无符号单通道的灰度图片容器, 并且初始化图片为白色255
for (int i = 0; i < src.rows; i++)
{
for (int j = 1; j < src.cols - 1; j++)
{
dImg.at<uchar>(i, j - 1) = src.at<uchar>(i, j + 1) -
src.at<uchar>(i, j - 1);
}
}
cvNamedWindow("dst", CV_WINDOW_AUTOSIZE);
imshow("dst", dImg);
waitKey(0);
}
高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次。这种模糊技术生成的图像,其视觉效果就像是经过一个半透明屏幕在观察图像,这与镜头焦外成像效果散景以及普通照明阴影中的效果都明显不同。高斯平滑也用于计算机视觉算法中的预先处理阶段,以增强图像在不同比例大小下的图像效果(参见尺度空间表示以及尺度空间实现)。 从数学的角度来看,图像的高斯模糊过程就是图像与正态分布做卷积。由于正态分布又叫作高斯分布,所以这项技术就叫作高斯模糊。图像与圆形方框模糊做卷积将会生成更加精确的焦外成像效果。由于高斯函数的傅立叶变换是另外一个高斯函数,所以高斯模糊对于图像来说就是一个低通滤波器。
"高斯函数"又称正态分布函数其一维形式如下:
为x的均值,
为x的方差。中心点就是原点,所以
为0。
根据一维推导出二维函数为:
构建一个矩阵例如三阶
每次像素点中同样选择3*3的矩阵,矩阵中像素的值分别与对应位置相乘,求和得到的值赋给中央。
由于每次运算只会赋值给中央,会导致边界无法计算。
#include <opencv2/opencv.hpp>
#define PI 3.1415926
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
Mat src = imread("F:/private/photo/women.jpg", 1);
cvtColor(src, src, COLOR_BGR2GRAY);
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
//5*5卷积模板
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("gaussBlur", dst);
waitKey(0);
}
右侧的图形明显的比左侧模糊
随着
值得增大,图像更加模糊。
值分别为100、500。