当前位置: 首页 > article >正文

边缘检测算法(sobel)

 人工智能例子汇总:AI常见的算法和例子-CSDN博客 

Sobel边缘检测算法是一种用于图像处理中的边缘检测方法,它能够突出图像中灰度变化剧烈的地方,也就是边缘。该算法通过计算图像在水平方向和垂直方向上的梯度来检测边缘,梯度值越大表示图像边缘越明显

完整代码:

import torch
import torch.nn.functional as F
import cv2
import numpy as np
import matplotlib.pyplot as plt

# 加载图像并转换为灰度图
image = cv2.imread('touxiang.jpg', cv2.IMREAD_GRAYSCALE)

# 确保图像加载成功
if image is None:
    print("Error loading image")
    exit()

# 转换为 PyTorch 张量,并进行归一化
image_tensor = torch.tensor(image, dtype=torch.float32) / 255.0
image_tensor = image_tensor.unsqueeze(0).unsqueeze(0)  # 添加批次和通道维度

# Sobel 卷积核
sobel_x = torch.tensor([[1, 0, -1],
                        [2, 0, -2],
                        [1, 0, -1]], dtype=torch.float32).unsqueeze(0).unsqueeze(0)  # 形状 [1, 1, 3, 3]
sobel_y = torch.tensor([[1, 2, 1],
                        [0, 0, 0],
                        [-1, -2, -1]], dtype=torch.float32).unsqueeze(0).unsqueeze(0)  # 形状 [1, 1, 3, 3]

# 使用 PyTorch 卷积计算水平和垂直梯度
grad_x = F.conv2d(image_tensor, sobel_x, padding=1)
grad_y = F.conv2d(image_tensor, sobel_y, padding=1)

# 计算梯度幅度(边缘强度)
grad_mag = torch.sqrt(grad_x**2 + grad_y**2)

# 去除多余的维度,并将结果缩放至 [0, 255] 范围
grad_mag = grad_mag.squeeze().numpy()  # 转为 NumPy 数组
grad_mag = np.uint8(np.clip(grad_mag * 255.0, 0, 255))  # 转为 8 位图像

# 显示原图和边缘图
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title("Original Image")
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(grad_mag, cmap='gray')
plt.title("Sobel Edge Detection")
plt.axis('off')

plt.show()

结果:

区别:
任务不同:Sobel 是边缘检测算法,主要用于检测图像的边缘,而 Candy 主要用于图像的色彩处理或增强,通常是将黑白图像转化为彩色图像或应用某些特效。
输出不同:Sobel 输出的是一个梯度图或边缘检测结果,而 Candy 输出的是带有颜色的图像。
使用的技术不同:Sobel 算法基于图像的梯度和卷积,而 Candy 可能使用深度学习、滤镜或图像编辑技术来处理图像的颜色。
Sobel:边缘检测,突出图像的结构和轮廓。
Candy:通常指的是给图像添加颜色或应用艺术效果,涉及颜色处理和图像增强


http://www.kler.cn/a/529767.html

相关文章:

  • 新站如何快速获得搜索引擎收录?
  • Ollama+OpenWebUI部署本地大模型
  • UE编辑器工具
  • 【算法设计与分析】实验7:复杂装载及0/1背包问题的回溯法设计与求解
  • LS和MMSE信道估计
  • 新鲜速递:DeepSeek-R1开源大模型本地部署实战—Ollama + MaxKB 搭建RAG检索增强生成应用
  • redis集群理论详解
  • 安卓pad仿写element-ui表单验证
  • 关于合并两个有序链表
  • STM32CUBEIDE编译的hex使用flymcu下载后不能运行
  • Ubuntu 22.04系统安装部署Kubernetes v1.29.13集群
  • JavaScript系列(54)--性能优化技术详解
  • c语言(关键字)
  • Android 13 取色引擎详解
  • 每日 Java 面试题分享【第 19 天】
  • 微信小程序问题1 skyline模式渲染webview模式
  • Labelme转Voc、Coco
  • LeetCode 2909. 元素和最小的山形三元组 II
  • 实验9 JSP访问数据库(二)
  • 94,【2】buuctf web [安洵杯 2019]easy_serialize_php
  • 三角形的最大周长(976)
  • 群晖NAS安卓Calibre 个人图书馆
  • 在C++中,成员变量必须在对象构造完成前初始化,但初始化的方式有多种...
  • K8s Kubernetes集群部署
  • 【黄啊码】DeepSeek提示词大道至简版
  • 62.病毒在封闭空间中的传播时间|Marscode AI刷题