图片去噪及边缘检测

ops/2024/10/22 17:34:39/

一:在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/ops/103556.html

相关文章

报错-_pickle.UnpicklingError: invalid load key, ‘\x9a‘.

1.报错1 File “/usr/local/lib/python3.8/dist-packages/torch/serialization.py”, line 1002, in _legacy_load magic_number pickle_module.load(f, **pickle_load_args) _pickle.UnpicklingError: invalid load key, ‘\x9a’. 报错原因:使用bert的预训练模…

PTH哈希传递攻击

PTH哈希传递攻击(Pass The Hash) 一、PTH简介 1、攻击原理 在使用 NTLM 身份验证的系统或服务上,用户密码永远不会以明文形式通过网络发送。 Windows 上的应用程序要求用户提供明文密码,然后调用 LsaLogonUser 类的 API&#x…

一个php快速项目搭建框架源码,带一键CURD等功能

介绍: 框架易于功能扩展,代码维护,方便二次开发,帮助开发者简单高效降低二次开发成本,满足专注业务深度开发的需求。 百度网盘下载 图片:

SpringBoot 集成mybatis-plus

目录 前言 简介 前提 运用mybatis-plus(使用20241.1版本的idea) 1 自动创建springboot项目 1.1 点击新建,SpringBoot 1.2 添加依赖项,点击创建 2添加 MyBatis-Plus Starter 依赖 2.1 打开mybatis-plus官网,点…

CF C. Candy Store

原题链接:Problem - C - Codeforces 题意:多测,先给出n代表n种糖果,每种糖果分别给出数量和单价,可以将糖果平均分成若干袋,每一袋的的价格是一袋糖果数量单价,对于每一种糖果都求出一袋的价格…

Adobe Illustrator vs Photoshop:设计界的“相声搭档”

在这个五彩斑斓的设计世界里,Adobe Illustrator(简称AI)和Adobe Photoshop(简称PS)就像是相声界的黄金搭档,一个逗哏,一个捧哏,共同演绎着创意的无限可能。今天,咱们就来…

linux上查找某应用所在的绝对路径

linux上查找某应用所在的绝对路径 1、已知应用名称 找到应用的进程号 例:查找nginx的进程号 ps -ef | grep nginx 或者 ps -aux | grep nginx 2、通过端口号找进程号 lsof -i:80 3、通过进程号找到所在目录,Linux在启动一个进程时,系统会在/proc目…

005、架构_数据节点

​DN组件总览 ​ DN节点包含进程 dbagent进程:主要提供数据节点高可用、数据导入导出、数据备份恢复、事务一致性、运维类功能、集群的扩缩容、卸数等功能;MySQL进程:主要提供数据一致性、分组管理、快同步复制、高低水位等;