边缘保留滤波及边缘提取

边 缘 保 留 滤 波 及 边 缘 提 取 边缘保留滤波及边缘提取

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. 边缘方向-与边缘法线垂直的向量方向
  3. 边缘位置或者中心-图像边缘所在位置
  4. 边缘强度-跟沿法线方向的图像局部对比相关,对比越大,越是边缘。

边缘类型

1 跃迁类型
在这里插入图片描述

2 屋脊类型

在这里插入图片描述

基于梯度的边缘提取

在这里插入图片描述

存在一个比较严重的问题,那就是阈值T,无论怎么设,都会有遗漏

所以提出了Canny边缘提取算法

2.2 Canny边缘提取算法

  1. 模糊去噪声–高斯模糊
  2. 提取梯度与方向
  3. 非最大信号抑制
  4. 高低阈值链接

在这里插入图片描述

高低阈值链接规则

在这里插入图片描述

#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;
}

在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值