python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测

OpenCV中边缘检测四种常用算子:

(1)Sobel算子
                Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度,并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核,分别用于计算水平方向(Gx)和垂直方向(Gy)的梯度,通过对两个方向的梯度进行合并来得到最终的边缘图像。

import cv2

image0 = cv2.imread('output.png')    # 读入图像
cv2.imshow('wino',image0)   # 展示原图像

# 对x方向进行边缘检测,dx=1表示对x方向,dy=0表示不对y轴方向,参数-1表示输出图像将使用与输入图像相同的数据类型来存储像素值
# x方向的边缘
sobelx = cv2.Sobel(image0,-1,dx=1,dy=0)
cv2.imshow("win1",sobelx)

# x方向的边缘,包括负数信息,因为图像的灰度值范围为0~255,负数展示不出来
# cv2.CV_64F表示将默认的uint8数据类型改为float64
sobelx64 = cv2.Sobel(image0,cv2.CV_64F,dx=1,dy=0)
cv2.imshow("win2",sobelx64)

# x方向的边缘,包括负数信息, 使用convertScaleAbs将灰度值进行绝对值处理,负值信息即可显示
sobelxfull = cv2.convertScaleAbs(sobelx64)
cv2.imshow('win3',sobelxfull)

# x方向不检测,y轴方向检测
sobely = cv2.Sobel(image0,-1,dx=0,dy=1)
cv2.imshow("win4",sobely)

# y方向的边缘,包括负数信息
sobely64 = cv2.Sobel(image0,cv2.CV_64F,dx=0,dy=1)
sobelyfull = cv2.convertScaleAbs(sobely64)
cv2.imshow("win5",sobelyfull)

# x和y方向进行加权处理
yuan_xy_full = cv2.addWeighted(sobelxfull,1,sobelyfull,1,0)
cv2.imshow('sobely',yuan_xy_full)
cv2.waitKey(0)

       (2)Scharr 算子
                Scharr算子是一种改进的Sobel算子,它使用更复杂的权重来提高梯度计算的精确度,尤其是在低对比度边缘上。与 Soble 的速度相同,且精度更高。Scharr 算子与 Sobel 算子的不同点是在平滑部分,其中心元素占的权重更重,相当于使用较小标准差的高斯函数,也就是更瘦高的模板。ksize参数表示卷积核的大小。它是一个正奇数,用于指定卷积核的尺寸。

import cv2
image0 = cv2.imread('output.png',cv2.IMREAD_GRAYSCALE)  # 导入图像灰度图形式
cv2.imshow('image0',image0)

x64 = cv2.Scharr(image0,cv2.CV_64F,dx=1,dy=0)  # 对x方向进行处理,将数据类型保存并转换成浮点型
xfull = cv2.convertScaleAbs(x64)  # 转换为绝对值,负数转换为正数

y64 = cv2.Scharr(image0,cv2.CV_64F,dx=0,dy=1)  # 对y轴方向进行处理
yfull = cv2.convertScaleAbs(y64)  # 绝对值处理

xysobel = cv2.addWeighted(xfull,1,yfull,1,0)  # 加权处理
cv2.imshow('xy_Scharr',xysobel)
cv2.waitKey(0)

      (3)Canny边缘检测算法
                Canny算法是一种多阶段的边缘检测技术,以其高效性和准确度而受到广泛应用。它通过噪声滤波、梯度计算、非极大值抑制和双阈值等步骤来识别边缘。Canny算法能够提取高质量的边缘,并且对噪声有一定的抵抗能力。

  • 步骤

    1. 高斯滤波:使用高斯滤波器平滑图像以减少噪声。
    2. 梯度计算:使用Sobel算子计算梯度的强度和方向。
    3. 非极大值抑制:抑制非边缘的像素,仅保留局部最大值。
    4. 双阈值检测:应用高、低两个阈值以确定边缘。
    5. 边缘连接:通过连接在高阈值附近的低阈值像素来形成最终边缘。
  • 输出:生成清晰的边缘图。

   

import cv2
import numpy as np

image1 = cv2.imread('output.png',cv2.IMREAD_GRAYSCALE)
cv2.imshow('image1',image1)

# 高斯平滑
blurred = cv2.GaussianBlur(image1, (5, 5), 1.5)

# 参数:其后表示边缘检测的像素值低于100像素的被丢弃,高于150像素的被丢弃
image1_canny = cv2.Canny(image1,100,150)
cv2.imshow('canny',image1_canny)
cv2.waitKey(0)

   

(4)Laplacian算子
                Laplacian算子是一种基于二阶导数的边缘检测算法。它通过计算图像的二阶导数来查找图像中的边缘。Laplacian算子对于边缘的宽度和方向不敏感,因此可以检测出比较粗的边缘。它对噪声相对敏感,通常需要在使用前进行平滑处理。

使用拉普拉斯算子实现彩色浮雕效果


import cv2
import numpy as np

'''
使用拉普拉斯算子实现彩色浮雕效果原理
1灰度转换:首先,将彩色图像转换为灰度图像。范围通常为0到255。

2灰度差异计算:
对于灰度图像中的每个像素,计算其与相邻像素的灰度差异。
这通常是通过将当前像素的灰度值与其相邻像素(如水平相邻、垂直相邻或对角线相邻)的灰度值进行相减来实现的。
这种差异反映了图像中的边缘和轮廓信息。

3偏移调整:
将计算得到的灰度差异加上一个偏移值。这个偏移值用于控制浮雕效果的强度和方向。
通过调整偏移值,可以使浮雕效果更加明显或柔和。选择一个适当的偏移值(如128),这样可以使处理后的图像灰度值保持在合理的范围内。

4灰度范围映射:
将计算得到的灰度值映射到合适的灰度范围(通常是0到255)。归一化。
这确保了浮雕效果的结果是一个合法的灰度图像。如果灰度值超出了这个范围,则需要进行裁剪或归一化处理。

    
'''
def emboss_effect_laplacian(image):
    if image is None:
        print("Error: Unable to read image.")
        return
    # 消除小噪声
    denoise = cv2.medianBlur(image, 3)
    # 使用拉普拉斯算子计算二阶导数
    laplacian = cv2.Laplacian(denoise, cv2.CV_64F)
    # 将拉普拉斯的值放大来模拟光照效果
    emboss = cv2.convertScaleAbs(laplacian * 2 + 128)  # 偏移量128是为了使值分布更均匀
    return emboss
if __name__ == '__main__':
    original = cv2.imread("f:/apple.jpg", cv2.IMREAD_COLOR)
    emboss = emboss_effect_laplacian(original)
    result = np.concatenate((original, emboss), axis=1)

    # 显示原始图像和浮雕效果图像
    cv2.imshow('Original Image', original)
    cv2.imshow('Emboss Effect (Laplacian)', emboss)
    cv2.imwrite("emboss-result.jpg", result)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/956138.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

R语言绘图

多组火山图 数据准备&#xff1a; 将CSV文件同一在一个路径下&#xff0c;用代码合并 确保文件列名正确 library(fs) library(dplyr) library(tidyr) library(stringr) library(ggplot2) library(ggfun) library(ggrepel)# 获取文件列表 file_paths <- dir_ls(path &quo…

IDEA2023版中TODO的使用

介绍&#xff1a;TODO其实本质上还是注释&#xff0c;只不过加上了TODO这几个字符&#xff0c;可以让使用者快速找到。 注意&#xff1a;在类、接口等文件中&#xff0c;注释是使用// 即&#xff1a;// TODO 注释内容 在配置文件中&#xff0c;注释是使用# 即&#xff1a;# TO…

Maven的多模块架构设计诺依的多模块

Maven的多模块架构设计 多模块架构设计&#xff0c;本文采用 诺依的多模块架构设计分析

【JsonViewer】Json格式化

使用 Notepad 对 Json 数据进行格式化处理&#xff0c;使数据在结构上更清晰 1.在线安装 安装之后&#xff0c;重启应用&#xff0c;在插件菜单栏即可看到 JsonViewer 选项&#xff0c;在 Notepad 中放入 Json 数据&#xff0c;点击 Format Json 进行数据格式化 2.离线安装 …

【漏洞预警】FortiOS 和 FortiProxy 身份认证绕过漏洞(CVE-2024-55591)

文章目录 一、产品简介二、漏洞描述三、影响版本四、漏洞检测方法五、解决方案 一、产品简介 FortiOS是Fortinet公司核心的网络安全操作系统&#xff0c;广泛应用于FortiGate下一代防火墙&#xff0c;为用户提供防火墙、VPN、入侵防御、应用控制等多种安全功能。 FortiProxy则…

企业分类相似度筛选实战:基于规则与向量方法的对比分析

文章目录 企业表相似类别筛选实战项目背景介绍效果展示基于规则的效果基于向量相似的效果 说明相关文章推荐 企业表相似类别筛选实战 项目背景 在当下RAG&#xff08;检索增强生成&#xff09;技术应用不断发展的背景下&#xff0c;掌握文本相似算法不仅能够助力信息检索&…

Ubuntu打开文件夹不显示文件

1.情况介绍 使用ubuntu打开文件夹不显示文件夹里面的内容&#xff0c;而是直接打开了资源查看器。 2.解决办法 命令行安装nautilus sudo apt-get install nautilus

Go-知识 版本演进

Go-知识 版本演进 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具语言包工具小修订 r58(2011/06/29)语言包工具小修订 r59(2011/08/01)语言包工具 r60(2011/09/07)语言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…

pycharm+pyside6+desinger实现查询汉字笔顺GIF动图

一、引言 这学期儿子语文期末考试有一道这样的题目&#xff1a; 这道题答案是B&#xff0c;儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的&#xff0c;因为二者有一个笔画是不一样的&#xff0c;“车字旁”下边那笔是“提”&#xff0c;而“车”字是“横”&am…

Red Hat8:搭建DHCP服务器

1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 &#xff08;搭建的时候用vim 自行定义文件名.repo或者是vi 自行定义文件名.repo&#xff09; 5、安装dhcp-server 6、复制模板文件 dhcpd.conf 是DHCP服务的配置文件&#xff0c;DHCP服务所有参数都是通过修改dhcpd.co…

Web前端------HTML链接标签

1.普通超链接 &#xff08;1&#xff09;链接外部网页 点击文本&#xff0c;跳转到外部网页 <!DOCTYPE html><html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

linux下springboot项目nohup日志或tomcat日志切割处理方案

目录 1. 配置流程 2. 配置说明 其他配置选项&#xff1a; 3. 测试执行 4. 手动执行 https://juejin.cn/post/7081890486453010469 通常情况下&#xff0c;我们的springboot项目部署到linux服务器中&#xff0c;通过nohup java -jar xxx.jar &指令来进行后台运行我们…

每日进步一点点(网安)

1.BUU CODE REVIEW 1 先看源代码 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->correct $this->input) {ec…

2025.1.19机器学习笔记:PINN文献精读

第三十周周报 一、文献阅读题目信息摘要Abstract创新点物理背景网络框架实验实验一&#xff1a;直道稳定流条件实验二&#xff1a;环状网络中的非稳定流条件 结论缺点及展望 二、代码实践总结 一、文献阅读 题目信息 题目&#xff1a;《Enhanced physics-informed neural net…

移动端布局 ---- 学习分享

响应式布局实现方法 主流的实现方案有两种: 通过rem \ vw/vh \ 等单位,实现在不同设备上显示相同比例进而实现适配. 响应式布局,通过媒体查询media 实现一套HTML配合多套CSS实现适配. 在学习移动端适配之前,还需要学习移动端适配原理: 移动端适配原理(Viewport) 了解VSCo…

STM32 FreeROTS 任务创建和删除实验(静态方法)

实验目标 学会 xTaskCreateStatic( )和 vTaskDelete( ) 的使用&#xff1a; start_task&#xff1a;用来创建其他的三个任务。task1&#xff1a;实现LED1每500ms闪烁一次。task2&#xff1a;实现LED2每500ms闪烁一次。 task3&#xff1a;判断按键KEY1是否按下&#xff0c;按…

家政服务小程序,打造智慧家政新体验

春节即将来临&#xff0c;家政市场呈现出了火热的场景&#xff0c;大众对家政服务的需求持续增加。 近年来&#xff0c;家政市场开始倾向数字化、智能化&#xff0c;借助科学技术打造家政数字化平台&#xff0c;让大众在手机上就可以预约家政服务&#xff0c;减少传统家政市场…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

Vue3 nginx 打包后遇到的问题

前端vite文件配置 export default defineConfig({plugins: [vue(),DefineOptions()],base:./,resolve:{alias:{:/src, //配置指向src目录components:/src/components,views:/src/views}},server:{// host:0.0.0.0,// port:7000,proxy:{/api:{target:xxx, // 目标服务器地址 &am…

linux下配置python环境及库配置

概述 使用Linux作为开发环境拥有完整的开源工具链且易于通过系统包管理器安装&#xff0c;与系统集成良好。对于开源项目开发&#xff0c;能方便地从源代码编译安装软件&#xff0c;使用构建工具&#xff0c;提供更原生的开发环境。 可高度定制系统&#xff0c;满足特殊开发需求…