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

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

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

import cv2image0 = 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 npimage1 = 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()

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言编程笔记:文件处理的艺术

大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文一、为什么要用文件二、文件的分…

头歌答案--爬虫实战

目录 urllib 爬虫? 第1关:urllib基础 任务描述 第2关:urllib进阶? 任务描述 requests 爬虫 第1关:requests 基础 任务描述 第2关:requests 进阶 任务描述 网页数据解析 第1关:XPath解析网页? 任务描述…

【JavaEE】Spring Web MVC

目录 一、Spring Web MVC简介 1.1 MVC简介1.2 Spring MVC1.3 RequestMapping注解1.3.1 使用1.3.2 RequestMapping的请求设置 1.3.2.1 方法11.3.2.2 方法2 二、Postman介绍 2.1 创建请求2.2 界面如下:2.3 传参介绍 一、Spring Web MVC简介 官方文档介绍&#xff…

Sqlmap入门

原理 在owasp发布的top10 漏洞里面,注入漏洞一直是危害排名第一,其中数据库注入漏洞是危害的。 当攻击者发送的sql语句被sql解释器执行,通过执行这些恶意语句欺骗数据库执行,导致数据库信息泄漏 分类 按注入类型 常见的sql注入…

RabbitMQ基础篇

文章目录 1 RabbitMQ概述1.1 消息队列1.2 RabbitMQ体系结构 2 RabbitMQ工作模式2.1 简单模式(Simple Queue)2.2 工作队列模式(Work Queues)2.3 发布/订阅模式(Publish/Subscribe)2.4 路由模式(R…

javaEE初阶————多线程初阶(2)

今天给大家带来第二期啦,保证给大家讲懂嗷; 1,线程状态 NEW安排了工作还未开始行动RUNNABLE可工作的,或者即将工作,正在工作BLOCKED排队等待WAITING排队等待其他事TIMED_WAITING排队等待其他事TERMINATED工作完成了 …

于灵动的变量变幻间:函数与计算逻辑的浪漫交织(下)

大家好啊,我是小象٩(๑ω๑)۶ 我的博客:Xiao Xiangζั͡ޓއއ 很高兴见到大家,希望能够和大家一起交流学习,共同进步。 这一节我们主要来学习单个函数的声明与定义,static和extern… 这里写目录标题 一、单个函数…

【数据分析】02- A/B 测试:玩转假设检验、t 检验与卡方检验

一、背景:当“审判”成为科学 1.1 虚拟场景——法庭审判 想象这样一个场景:有一天,你在王国里担任“首席审判官”。你面前站着一位嫌疑人,有人指控他说“偷了国王珍贵的金冠”。但究竟是他干的,还是他是被冤枉的&…

HTML应用指南:利用GET请求获取全国特斯拉充电桩位置

随着电动汽车的普及,充电基础设施的建设变得至关重要。作为电动汽车领域的先驱,特斯拉不仅在车辆技术创新上持续领先,还积极构建广泛的充电网络,以支持其不断增长的用户群体。为了提升用户体验和服务质量,开发人员和数…

【原创】大数据治理入门(2)《提升数据质量:质量评估与改进策略》入门必看 高赞实用

提升数据质量:质量评估与改进策略 引言:数据质量的概念 在大数据时代,数据的质量直接影响到数据分析的准确性和可靠性。数据质量是指数据在多大程度上能够满足其预定用途,确保数据的准确性、完整性、一致性和及时性是数据质量的…

OpenVela——专为AIoT领域打造的开源操作系统

目录 一、系统背景与开源 1.1. 起源 1.2. 开源 二、系统特点 2.1. 轻量化 2.2. 标准兼容性 2.3. 安全性 2.4. 高度可扩展性 三、技术支持与功能 3.1. 架构支持 3.2. 异构计算支持 3.3. 全面的连接套件 3.4. 开发者工具 四、应用场景与优势 4.1. 应用场景 4.2. …

寒假1.18

web(报错注入) [第一章 web入门]SQL注入-2 题解: 打开是个403界面,还以为没开成 通过题目提示,访问/login.php /user.php 合在一起访问屁都没有,分开访问,/login.php回显: /user.p…

如何通过 Apache Airflow 将数据导入 Elasticsearch

作者:来自 Elastic Andre Luiz 了解如何通过 Apache Airflow 将数据导入 Elasticsearch。 Apache Airflow Apache Airflow 是一个旨在创建、安排(schedule)和监控工作流的平台。它用于编排 ETL(Extract-Transform-Load&#xff0…

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

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

Jenkins-Pipeline简述

一. 什么是Jenkins pipeline: pipeline在jenkins中是一套插件,主要功能在于,将原本独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂发布流程。Pipeline的实现方式是一套Groovy DSL,任何发布流程…

基于海思soc的智能产品开发(高、中、低soc、以及和fpga的搭配)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 市场上关于图像、音频的soc其实非常多,这里面有高、中、低档,开发方式也不相同。之所以会这样,有价格的因素&am…

C# 修改项目类型 应用程序程序改类库

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…

6、原来可以这样理解C语言_函数(1/8)函数的概念

目录 一、函数的概念 一、函数的概念 数学中我们其实就⻅过函数的概念,⽐如:⼀次函数 ykxb ,k和b都是常数,给⼀个任意的x,就 得到⼀个y值。 其实在C语⾔也引⼊函数(function)的概念&#xff0c…

Excel 技巧10 - 如何检查输入重复数据(★★)

本文讲了如何在Excel中通过COUNTIF来检查输入重复数据。 当输入重复数据时,显示错误提示。 1,通过COUNTIF来检查输入重复数据 比如下面是想检查不要输入重复的学号。 选中C列,点 Menu > 数据 > 数据验证 在数据验证页面&#xff0c…

【Linux系统】Ext系列磁盘文件系统二:引入文件系统(续篇)

inode 和 block 的映射 该博文中有详细解释:【Linux系统】inode 和 block 的映射原理 目录与文件名 这里有几个问题: 问题一: 我们访问文件,都是用的文件名,没用过 inode 号啊? 之前总是说可以通过一个…