边 缘 保 留 滤 波 及 边 缘 提 取 边缘保留滤波及边缘提取 边缘保留滤波及边缘提取
1.视频教程:
B站、网易云课堂、腾讯课堂
2.代码地址:
Gitee
Github
3.存储地址:
Google云
百度云:
提取码:
1.边缘保留滤波
## 高斯双边滤波
非局部均值去噪(NLM)
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void add_salt_and_pepper_noise(Mat &image);
void add_gaussion_noise(Mat &image);
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);
add_gaussion_noise(src);
// 高斯滤波
Mat dst;
GaussianBlur(src, dst, Size(5, 5), 0);
imshow("gaussian denoise demo", dst);
// 双边滤波
Mat dst1;
bilateralFilter(src, dst1, 0, 100, 10);
imshow("bilateral denoise", dst1);
// NLM
Mat gray, result2;
cvtColor(src, gray, COLOR_BGR2GRAY);
fastNlMeansDenoising(gray, result2, 15, 10, 30);
imshow("NLM denoise", result2);
waitKey(0);
destroyAllWindows();
return 0;
}
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);
}
2.边缘提取
2.1 图像边缘定义与类型
- 边缘法线-单位向量在该方向上图像像素强度变化最大
- 边缘方向-与边缘法线垂直的向量方向
- 边缘位置或者中心-图像边缘所在位置
- 边缘强度-跟沿法线方向的图像局部对比相关,对比越大,越是边缘。
边缘类型
1 跃迁类型
2 屋脊类型
基于梯度的边缘提取
存在一个比较严重的问题,那就是阈值T,无论怎么设,都会有遗漏
所以提出了Canny边缘提取算法
2.2 Canny边缘提取算法
- 模糊去噪声–高斯模糊
- 提取梯度与方向
- 非最大信号抑制
- 高低阈值链接
高低阈值链接规则
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int t1 = 50;
Mat src;
void canny_demo(int,void*) {
Mat edges;
Canny(src,edges,t1,t1*3,3,false);
imshow("edges", edges);
}
int main(int argc, char** argv) {
src = imread("E:/cats.jpg", IMREAD_COLOR);
if (src.empty()) {
printf("image is empty!!!");
return -1;
}
namedWindow("src", WINDOW_AUTOSIZE);
imshow("src", src);
// Canny
createTrackbar("threshold value:","src",&t1,100, canny_demo);
canny_demo(0, 0);
waitKey(0);
destroyAllWindows();
return 0;
}