图 像 噪 声 和 去 噪 图像噪声和去噪 图像噪声和去噪
1.视频教程:
B站、网易云课堂、腾讯课堂
2.代码地址:
Gitee
Github
3.存储地址:
Google云
百度云:
提取码:
1.图像噪声
## 1.1 噪声类型
1.椒盐噪声
2.高斯噪声
3.其他噪声
void add_salt_and_pepper_noise(Mat &image);
void add_gaussion_noise(Mat &image);
void add_salt_and_pepper_noise(Mat &image) {
RNG rng(12345);
int h = image.rows;
int w = image.cols;
int nums = 10000;
for (int i = 0; i < nums; i++) {
int x = rng.uniform(0, w);
int y = rng.uniform(0, h);
if (i % 2 == 1) {
image.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
}
else {
image.at<Vec3b>(y, x) = Vec3b(0, 0, 0);
}
}
imshow("salt and pepper noise", image);
}
void add_gaussion_noise(Mat &image) {
// 高斯噪声
Mat noise = Mat::zeros(image.size(), image.type());
randn(noise, Scalar(15, 15, 15), Scalar(30, 30, 30));
Mat dst;
add(image, noise, dst);
imshow("gaussian noise", dst);
dst.copyTo(image);
}
1.2 噪声生成
椒盐噪声
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("E:/cats.jpg", IMREAD_COLOR);
if (src.empty()) {
printf("image is empty!!!");
return -1;
}
imshow("src", src);
// 椒盐噪声
RNG rng(12345);
int h = src.rows;
int w = src.cols;
int nums = 10000;
for (int i = 0; i < nums; i++) {
int x = rng.uniform(0, w);
int y = rng.uniform(0, h);
if (i % 2 == 1) {
src.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
}
else {
src.at<Vec3b>(y, x) = Vec3b(0, 0, 0);
}
}
imshow("salt and pepper noise", src);
waitKey(0);
destroyAllWindows();
return 0;
}
高斯噪声
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("E:/cats.jpg", IMREAD_COLOR);
if (src.empty()) {
printf("image is empty!!!");
return -1;
}
imshow("src", src);
// 高斯噪声
Mat noise = Mat::zeros(src.size(), src.type());
randn(noise, Scalar(15, 15, 15), Scalar(30, 30, 30));
Mat dst;
add(src, noise, dst);
imshow("gaussian noise", dst);
waitKey(0);
destroyAllWindows();
return 0;
}
2.图像去噪
中值滤波(对椒盐噪声的效果好)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = imread("E:/cats.jpg", IMREAD_COLOR);
if (src.empty()) {
printf("image is empty!!!");
return -1;
}
imshow("src", src);
// 加椒盐噪声
RNG rng(12345);
int h = src.rows;
int w = src.cols;
int nums = 10000;
for (int i = 0; i < nums; i++) {
int x = rng.uniform(0, w);
int y = rng.uniform(0, h);
if (i % 2 == 1) {
src.at<Vec3b>(y, x) = Vec3b(255, 255, 255);
}
else {
src.at<Vec3b>(y, x) = Vec3b(0, 0, 0);
}
}
imshow("salt and pepper noise", src);
Mat dst;
medianBlur(src, dst, 5);
imshow("medianBlur denoise ", dst);
waitKey(0);
destroyAllWindows();
return 0;
}