图片去噪及边缘检测

news/2025/1/15 22:50:55/

一:在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…