图片去噪及边缘检测

news/2024/9/17 8:39:59/ 标签: opencv, 计算机视觉, 人工智能

一:在Python中,图片去噪可以通过不同的方法实现,这些方法包括使用简单的滤波技术到更复杂的算法,比如高斯模糊、中值滤波、非局部均值去噪(Non-local Means Denoising)等。在这里,我将介绍几种常见的图片去噪方法,包括OpenCV库中实现的一些高效算法。
高斯模糊去噪
高斯模糊是一种常见的去噪手段,它通过将图片与高斯核卷积来减少图片噪声。不过,高斯模糊通常会使图片变得模糊,适用于噪声较小的情况。

import cv2
# 读取图片
image = cv2.imread('your_image_path.jpg')
# 应用高斯模糊
blurred = cv2.GaussianBlur(image, (5, 5), 0)
# 显示结果
cv2.imshow('Original', image)
cv2.imshow('Blurred', blurred)
cv2.waitKey(0)
cv2.destroyAllWindows()

中值滤波去噪
中值滤波是另一种常见的去噪技术,尤其适用于去除椒盐噪声。这种方法会将像素点的值替换为周围邻域内像素点的中值。

import cv2# 读取图片
image = cv2.imread('your_image_path.jpg')
# 应用中值滤波
median = cv2.medianBlur(image, 5)
# 显示结果
cv2.imshow('Original', image)
cv2.imshow('Median Blurred', median)
cv2.waitKey(0)
cv2.destroyAllWindows()

非局部均值去噪
非局部均值去噪 (Non-local Means Denoising) 是一种更高级的去噪技术,相较于前两种方法,它能更好地保留图片细节。这种方法考虑了图片中每个像素的周围环境,可以有效地降低噪声同时保留边缘和结构。

import cv2# 读取图片
image = cv2.imread('your_image_path.jpg')
# 转换为灰度图像,因为非局部均值去噪通常在灰度图上效果更好
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用非局部均值去噪
dst = cv2.fastNlMeansDenoising(gray, None, 30, 7, 21)
# 显示结果
cv2.imshow('Original', gray)
cv2.imshow('Denoised', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

二:在Python中,进行图片边缘检测常用的方法是使用OpenCV库,它提供了多种边缘检测算法,如Canny边缘检测、Sobel边缘检测、Laplacian边缘检测等。
Canny边缘检测
Canny边缘检测是一种非常流行的边缘检测方法,因其优秀的边缘检测性能而被广泛应用。Canny边缘检测通过多个步骤实现,包括高斯模糊去噪、计算梯度幅值和方向、非最大抑制(NMS)以及双阈值检测和边缘连接等步骤。

import cv2# 读取图片
image = cv2.imread('path_to_your_image.jpg')
# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用Canny边缘检测
edges = cv2.Canny(gray, threshold1=30, threshold2=150)
# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Canny Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

Sobel边缘检测
Sobel边缘检测是基于Sobel算子的边缘检测方法,它通过计算图像灰度的空间梯度来检测边缘区域。Sobel算子在垂直和水平方向上对图像进行卷积,以此来计算相应方向上的梯度幅值。

import cv2
import numpy as np# 读取图片
image = cv2.imread('path_to_your_image.jpg')
# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Sobel边缘检测
x_gradient = cv2.Sobel(gray, cv2.CV_64F, dx=1, dy=0, ksize=3)
y_gradient = cv2.Sobel(gray, cv2.CV_64F, dx=0, dy=1, ksize=3)
# 计算梯度幅值
edges = np.sqrt(np.square(x_gradient) + np.square(y_gradient))
# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Sobel Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

Laplacian边缘检测
Laplacian边缘检测方法基于Laplacian算子,它计算图像灰度的二阶导数,从而检测边缘。Laplacian算子对图像噪声较为敏感,因此在应用之前通常需要先对图像进行去噪处理。

import cv2# 读取图片
image = cv2.imread('path_to_your_image.jpg')
# 转换为灰度图
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 应用高斯模糊去噪
blurred = cv2.GaussianBlur(gray, (3, 3), 0)
# 应用Laplacian边缘检测
edges = cv2.Laplacian(blurred, cv2.CV_64F)
# 显示结果
cv2.imshow('Original Image', image)
cv2.imshow('Laplacian Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

函数释义
cv2.Canny是进行Canny边缘检测的函数。Canny边缘检测是一种非常流行且高效的边缘检测算法,因其优秀的边缘检测效果而被广泛应用。
函数原型
cv2.Canny(image, threshold1, threshold2[, edges[, apertureSize[, L2gradient]]])
image: 输入图像,必须是一个8位的单通道图像。
threshold1: 第一个阈值,用于边缘连接。
threshold2: 第二个阈值,用于边缘检测。
edges: 可选的输出边缘图,大小和类型与输入图像相同。
apertureSize: Sobel算子的大小,默认值为3。
L2gradient: 一个布尔值。如果为True,则使用更精确的方程式来计算图像梯度的幅度。默认值为False。

cv2.Sobel函数用于计算图像的一阶导数,即梯度,在垂直或水平方向上确定边缘强度和方向。
函数原型
cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])
src: 输入图像。
ddepth: 输出图像的深度,通常设置为cv2.CV_64F以避免溢出。
dx: 表示对x方向求导数的阶数。
dy: 表示对y方向求导数的阶数。
dst: 输出图像。
ksize: Sobel算子的大小,必须为1、3、5或7。
scale: 缩放导数的比例常数(可选参数,默认为1)。
delta: 可选,在结果存储到dst之前添加到结果中的值。
borderType: 像素外推方法的标志(可选参数)。

cv2.Laplacian函数计算图像的拉普拉斯算子,可以用于增强图像中的边缘。
函数原型
cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])
src: 输入图像。
ddepth: 输出图像的深度。
dst: 输出图像。
ksize: 核的大小。如果ksize=-1,使用的是一个3x3的Scharr滤波器,它的效果要比3x3的Laplacian滤波器好。默认情况下是3。
scale: 缩放导数的比例常数(可选参数)。
delta: 可选,在结果存储到dst之前添加到结果中的值。
borderType: 像素外推方法的标志(可选参数)。
总结
这三个函数各有特点,cv2.Canny对于边缘的连贯性有较好的检测效果,特别适用于边缘检测与跟踪;cv2.Sobel可以精确控制检测的方向,适用于检测边缘方向;cv2.Laplacian则更倾向于增强图像的边缘效果。在实际使用中,应根据应用场景和需求选择合适的方法,并适当调整参数以达到最佳效果。


http://www.ppmy.cn/news/1521329.html

相关文章

自定义 SpringBoot Starter

文章目录 一、自定义 starter1.1 创建 maven 项目1.2 创建邮件配置属性类1.3 创建模拟邮件发送服务类1.4 创建自动配置类1.5 spring.factories 相关配置1.6 打包成依赖 二、测试项目2.1 创建项目2.2 application.yml 配置2.3 测试应用 参考资料 本文源码位于 java-demos/spring…

[OpenCV] 数字图像处理 C++ 学习——10基本阈值处理 附完整代码

文章目录 前言1.基本阈值处理类型(1)阈值二值化(binary)(2)阈值反二值化(binary_inv)(3)截断(truncate)(4)阈值取零(threshold to zero)(5)阈值反取零(threshold to zero inverted)(6)THRESH_MASK(7)THRESH_OTSU(8)THRESH_TRIANGLE 2.代码实现(1)图像读取…

OpenHarmony轻松玩转GIF数据渲染

OpenAtom OpenHarmony(以下简称“OpenHarmony”)提供了Image组件支持GIF动图的播放,但是缺乏扩展能力,不支持播放控制等。今天介绍一款三方库——ohos-gif-drawable三方组件,带大家一起玩转GIF的数据渲染,搞…

cad打印pdf很模糊怎么调清晰?2024教你快速进行文件格式转换方法合集

cad打印pdf很模糊怎么调清晰?2024教你快速进行文件格式转换方法合集 在使用CAD打印PDF时,输出的PDF文件如果模糊,通常是因为打印设置或者导出参数不正确。以下是五款软件和工具,能够帮助你调整CAD打印时的输出设置,从…

Qt 应用程序主界面

主要窗口类的概述 这些类提供了典型现代主应用程序窗口所需的一切,如主窗口本身、菜单和工具栏、状态栏等。 QAction 可以插入小部件的抽象用户界面操作 QActionGroup 将动作组合在一起 QDockWidget 小部件,可以停靠在QMainWindow中,也可以作…

黑马程序员Python数据挖掘|1Jupyter Notebook的使用

一 Jupyter Notebook介绍 二 为什么用Jupyter Notebook 1.在画图方面的优势 用 Jupyter Notebook : 方便进行数据的展示。 用 pycharm : 画完图后没有继续执行读取数据的代码,阻塞了。 把图片关掉才会继续执行代码。 2.在pycharm里如果读取很大的数据&…

优化器与现有网络模型的修改

一、优化器 optimizer optim.SGD(model.parameters(), lr0.01(学习速率), momentum0.9) optimizer optim.Adam([var1, var2], lr0.0001) 一般,学习率的设置,先从大的设置,逐渐变小。 神经网络可以参见上篇文章&am…

oceanbase OBCE 第四章实验 事务与远程执行

实验环境:企业版V3 1-1-1 前期准备: 新建一个 oracle 租户 1C2GB 新建资源规格: create resource unit u1_ora max_cpu1,min_cpu1,max_memory2G,min_memory2G,max_iops128,max_disk_size10G,max_session_num100; 新建资源池: c…

【AI】 代码界的超级加速器!阿里云通义灵码让你工作效率飙升,编程就像开了挂一样!

文章目录 一、正文:二、核心场景代码智能生成研发智能问答 三、功能介绍行间代码生成研发智能问答编码问题解决企业级管理 结语相关链接: 一、正文: 在当今快节奏的软件开发领域,提高工作效率是每一位开发者不断追求的目标。 通义…

Vue:F11全屏模式状态监听,识别

本文将介绍如何在vue中实现按F11键后全屏模式的监听。 来回切换F11之后,控制台打印结果如下图所示, <script lang="ts" setup>import {ref, onMounted, onBeforeUnmount } from vue;

2024国赛数学建模ABC题思路模型

完整的思路模型请查看文末名片 完整的思路模型请查看文末名片 完整的思路模型请查看文末名片

sql-libs第三关详细解答

首先看看and 12会不会正常显示 结果正常显示&#xff0c;说明存在引号闭合 加了一个引号&#xff0c;发现报错信息中还存在括号&#xff0c;说明sql语句中有括号&#xff0c;那我们还要闭合括号 现在就好了&#xff0c;and 11正常&#xff0c;and 12不正常&#xff0c;那就开始…

AI科学家:自动化科研的未来之路

随着人工智能&#xff08;AI&#xff09;技术的不断进步&#xff0c;AI已经在众多领域中展现了强大的潜力&#xff0c;尤其是在科研方面的应用正在引起广泛关注。最近&#xff0c;Sakana AI与牛津大学和不列颠哥伦比亚大学联合推出了一款被称为“AI科学家”的自动化科研工具&am…

一文搞懂大数据流式计算引擎Flink【万字详解,史上最全】

往期推荐 一文入门大数据准流式计算引擎Spark【万字详解&#xff0c;全网最新】-CSDN博客 浅谈维度建模、数据分析模型&#xff0c;何为数据仓库&#xff0c;与数据库的区别_统一数仓 数据库用户名-CSDN博客数仓架构&#xff1a;离线数仓、实时数仓Lambda和Kappa、湖仓一体数据…

数据库水平分表方案

数据库分表有很多策略&#xff0c;如下&#xff1a; 数据库分表是处理大型数据库中数据量过大的一种常见策略&#xff0c;它可以提高查询性能、减少锁竞争、降低维护成本等。以下是一些常见的数据库分表方案&#xff1a; 1. **垂直分表&#xff08;Vertical Partitioning&…

2024年6月第2套英语四级真题PDF

2024年6月第2套英语四级真题PDF

使用matlab的热门问题

MATLAB广泛应用于科学计算、数据分析、信号处理、图像处理、机器学习等多个领域&#xff0c;因此热门问题也涵盖了这些方面。以下是一些可能被认为当前最热门的MATLAB问题&#xff1a; 深度学习与神经网络&#xff1a; 如何使用MATLAB的深度学习工具箱&#xff08;Deep Learni…

【SQL】统一字符格式

目录 语法 需求 示例 分析 代码 语法 substring(column_name, start, length)用于从一个字符串中提取子字符串 column_name&#xff08;或任何字符串表达式&#xff09;&#xff1a;这是要从中提取子字符串的列名或字符串表达式。start&#xff1a;这是子字符串开始的位置…

2024年高教杯国赛(C题)数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

vue 踩坑记录

本地开发没有cookie 解决方案 设置代理&#xff0c;并把changeOrigin设为true proxy的changeOrigin如果设置为false&#xff1a;请求头中host仍然是浏览器发送过来的host&#xff1b; 如果设置成true&#xff1a;发送请求头中host会设置成target。 允许axios请求携带cookie等凭…