数字图像处理(入门篇)十 边缘检测

news2024/12/24 8:46:39

目录

 一 边缘检测算子

1 Roberts算子

2 Sobel算子

3 Prewitt算子

二 实践

(1)代码

(2)结果图

        边缘检测是计算机视觉中的基本问题,边缘检测的难点就在于如何又快又准确地提取图像的边缘信息。

       边缘检测的基本方法有很多,基于一阶导数的边缘检测算子包括Roberts边缘检测算子、Sobel边缘检测算子、Prewitt边缘检测算子、Krisch边缘检测算子和罗盘边缘检测算子;而基于二阶导数的边缘检测算子有Marr-Hildreth、拉普拉斯(Laplacian)边缘检测算子、Canny边缘检测算子。拉普拉斯边缘检测算子对噪声较敏感。

 一 边缘检测算子

1 Roberts算子

        在数字图像处理中Roberts边缘检测算子是最早的边缘检测算子之一Roberts算子是一种利用局部差分算子寻找边缘的算子。Roberts算子边缘定位相对准确在实际的应用中,Roberts边缘检测算子可用如下公式所示。

        Roberts边缘算子是一个2x2的模板,采用的是对角方向相邻的两个像素之差。用差分代替一阶偏导,算子表示如下公式所示。 

        在实际的应用中,图像中的每个像素点都用上述算子对应的两个 2X2 模板进行卷积运算,两个模板如下图所示。

2 Sobel算子

        Sobel边缘提取算法提供的边缘方向信息较准确,对噪声有一定的平滑效果,并且提取算法在空间上的实现较为容易。但是,Sobel算子提取的边缘定位的精度较低,同时会有伪边缘存在。Sobel边缘算子所采用的算法是先进行加权平均,然后进行微分运算。可以用差分代替一阶偏导,算子的计算方法公式如下。

        Sobel算子垂直方向模板可以检测出图像中的水平方向的边缘,Sobel水平模板则可以检测垂直方向的边缘。在实际的应用中,图像中的每一个像素点都用这两个卷积核分别进行卷积运算,取两个卷积的最大值作为该点的边缘输出值,运算结果是一幅边缘幅度图像。Sobel算子垂直方向和水平方向的模板如下图所示。

 3 Prewitt算子

        Prewitt边缘检测算子就是一种利用局部差分平均方法寻找边缘的算子。用差分代替一阶偏导可得算子如以下公式所示。

         与Sobel算子的方法一样,图像中的每一个像素点都用这两个卷积核分别进行卷积运算,取这两个卷积的最大值作为该点的边缘输出值,运算结果是一幅边缘幅度的图像。为了在检测边缘的同时能减少噪声所带来的影响,算子从加大边缘检测算子的角度出发,由2×2扩大到3×3来计算差分算子,Prewitt边缘检测算子的两个卷积模板如下图所示。

 

二 实践

(1)代码

import cv2
import matplotlib.pyplot as plt
import numpy as np
def dealImageResult(img_path):
    img = cv2.imread(img_path)
    # 灰度化处理图像
    grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 高斯滤波
    Gaussian = cv2.GaussianBlur(grayImage, (3, 3), 0, 0, cv2.BORDER_DEFAULT)
    # 自适应阈值处理
    Binary = cv2.adaptiveThreshold(Gaussian, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, -2)

    # Sobel算子
    x = cv2.Sobel(Gaussian, cv2.CV_16S, 1, 0, ksize=3)  # 对x求一阶导,垂直检测
    y = cv2.Sobel(Gaussian, cv2.CV_16S, 0, 1, ksize=3)  # 对y求一阶导,水平检测
    absX = cv2.convertScaleAbs(x)
    absY = cv2.convertScaleAbs(y)
    Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

    #Roberts算子
    kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
    kernely = np.array([[0, -1], [1, 0]], dtype=int)
    x = cv2.filter2D(Gaussian, cv2.CV_16S, kernelx)
    y = cv2.filter2D(Gaussian, cv2.CV_16S, kernely)
    absX = cv2.convertScaleAbs(x)
    absY = cv2.convertScaleAbs(y)
    Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

    #Prewitt算子
    kernelx = np.array([[1, 1, 1], [0, 0, 0], [-1, -1, -1]], dtype=int)
    kernely = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int)
    x = cv2.filter2D(Gaussian, cv2.CV_16S, kernelx)
    y = cv2.filter2D(Gaussian, cv2.CV_16S, kernely)
    absX = cv2.convertScaleAbs(x)
    absY = cv2.convertScaleAbs(y)
    Prewitt = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)

    # canny算子
    cannyedges = cv2.Canny(Gaussian, 50, 150, apertureSize=3)

    # Laplacian算子
    Laplacian_tmp = cv2.Laplacian(Gaussian, cv2.CV_16S, ksize=3)
    Laplacian = cv2.convertScaleAbs(Laplacian_tmp)

    fig = plt.figure(figsize=(9, 9))
    titles = ["img", "grayImage", "Gaussian", "Binary", "Sobel", "Roberts", "Prewitt", "Canny", "Laplacian"]
    images = [img, grayImage, Gaussian, Binary, Sobel, Roberts, Prewitt, cannyedges, Laplacian]
    for i in range(9):
        plt.subplot(3, 3, i + 1), plt.imshow(images[i], 'gray')
        plt.title(titles[i])
        plt.xticks([]), plt.yticks([])
    plt.show()
    fig.savefig('test_results.jpg', bbox_inches='tight')
if __name__ == '__main__':
    dealImageResult("test_bgr.jpg")
    pass

(2)结果图

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

流媒体分析之webrtc之rtcp

TCP作为RTP控制协议,对于弱网下音视频质量和会话控制具有重要的作用。 1. RTCP Header V:RTCP的版本号,一定等于2; P:如果设置,填充位表示数据包包含末尾的附加填充八位字节,不属于控制信息&am…

基于jsp+mysql+ssm影视爱好者论坛交流系统-计算机毕业设计

项目介绍 设计一个电影学习交流社区,使对电影的学生可以方便的进行交流。同时,通过此课题使学生熟悉网站搭建流程和方法。 意义:此课题实现后,可以为喜欢电影的学生提供一个交流学习的平台,提高学生学习兴趣。同时&am…

想提前躺平的程序员,这10个网站收好了!

我们的口号是:搞钱!搞钱!再搞钱!程序员想兼职但是不知道该上哪找? 为大家整理了7个程序员最常用的接私活平台,希望对你有帮助!记得点赞收藏,先码后看!1、程序员客栈 程序…

基于jsp+mysql+ssm游戏爱好者论坛交流设计-计算机毕业设计

项目介绍 本论坛是一个面向爱好游戏的玩家提供一个交流分享游戏攻略、视频、图片以及娱乐互动,让游戏玩家展示自己最真实的心声!论坛提供注册、登陆、发帖、回复、搜索等功能。用户可以利用论坛进行网上约伴、分享装备属性及其获得方法,进行账号交易等,…

5 - 线程池 Java内置的线程池 - 异步计算结果(Future)

前面介绍 ExecutorService 线程池接口的时候,其中,提交任务的方法 submit() 的返回值就是Future接口类型的。 我们刚刚在学习java内置线程池使用时,没有考虑线程计算的结果,但开发中,我们有时需要利用线程进行一些计算…

2022年牙科医疗行业研究报告

第一章 行业概况 1.1 牙科医疗概念及现状 牙科医疗行业是指以牙科医疗消费为基础,集合了牙科医疗服务、职业牙医教育培训、牙科医疗器材研究开发生产、市场策划、宣传、投资、经营、管理等于一体的医疗产业链。由于牙科疾病的特点,牙科医疗产业在具有一…

iOS扫码一图多码原生处理AVCaptureSession

文章目录前言正文1.定位二维码的位置2.扫码、解析总结前言 业务中一直有扫码的需求,这次说需要扫多个码(详细一点是一图多码),有点东西的。 第一点:怎么做:拿到手第一反应是有没有什么库可以直接调用的&am…

VSCode远程连接免密登录

配置了VSCode远程连接服务器,但每次打开project都需要重新输入密码,比较麻烦,所以下面就介绍一下如何免密码登入 在上一篇blog里面配置好VSCode远程连接服务器之后按照如下操作。 步骤如下: 在windows端: 1、winR打…

softmax原理性质解析并python实现

Softmax原理 Softmax函数用于将分类结果归一化,形成一个概率分布。作用类似于二分类中的Sigmoid函数。 对于一个k维向量z,我们想把这个结果转换为一个k个类别的概率分布p(z)。softmax可以用于实现上述结果,具体计算公式为: 对于k…

【数集项目之 MCDF】(一) 控制寄存器 control_register

写在前面 本项目为MCDF数据整形器设计,所有的参考代码见我的github https://github.com/SuperiorLQF/verilog_ALL/tree/master/MCDF 其中设计的参考文档见github文件中的MCDF修订版.docx文件。选择的工具链是Vscode & iverilog & gtkwave,相关工…

前端框架 Nuxt3 Vue3 SSR 总结

目录 一、Nuxt3安装 二、路由 1、普通路由 2、动态路由 3、获取路由参数 4、路由跳转标签 5、路由跳转api 三、静态资源 四、常用标签 1、title标签、useHead的API 五、公共模板布局 1、默认布局 2、自定义公共模板 3、动态自定义布局 六、插件 七、中间件 …

【QString 函数学习篇】

【QString 函数学习篇】【1】UI设计布局【2】QChar | setAlignment |【3】sprintf | asprintf | setNum | number |【4】toInt | toUpper [十进制->十六进制 | 十进制->二进制]【5】clear | append【6】二进制->十六进制 | 二进制->十进制【7】prepend【8】strimme…

[附源码]Python计算机毕业设计SSM基于的餐厅管理系统(程序+LW)

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

(十二)Vue之列表渲染

文章目录基本列表遍历数组遍历对象遍历字符串遍历指定次数key的原理虚拟DOM中key的作用用index作为key可能会引发的问题如何选择keyVue学习目录 上一篇:(十一)Vue之条件渲染 基本列表 在vue里基本的列表渲染可以使用v-for指令 v-for指令: …

Reactor手册

Flux Flux 是一个发出0-N个元素组成的异步序列的Publisher,可以被onComplete信号或者onError信号所终止。 Flux.just("Hello", "World").subscribe(System.out::println);// fromArray(),fromIterable(),fromStream()Flux.fromArra…

K8s 核心组件介绍

目录前言一、控制平面组件1.1 kube-apiserver1.2 etcd1.3 kube-scheduler1.4 kube-controller-manager1.5 cloud-controller-manager二、Node 组件2.1 kubelet2.2 kube-proxy2.3 Container Runtime前言 一个完整的 K8s 集群由一组节点(node)服务器组成&…

组队-蓝桥杯

题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 作为篮球队教练,你需要从以下名单中选出 11 号位至 55 号位各一名球员,组成球队的首发阵容。 每位球员担任 11 号位至 55 号位时的评分如下…

关于人脸检测和人脸关键点检测的详解(涉及Opencv 和Dlibd)

关于人脸识别,大家入门opencv,最常见的是用opencv级联分类器器里面的函数进行人脸的识别(当然里面包含很多各种物体的分类器,大家可以一一测试),今天我们来练一下关于人脸识别的级联器。 1,ope…

数据仓库(DW)、数据湖、数据中台的关系

一句话说明:数据中台是一套体系,既不是工具又不是存储,它可以包含数据湖和数据仓库。 数据仓库 数据仓库是一个面向主题的、集成的、随时间变化但信息本身相对稳定的数据集合,用于支持管理决策过程。其本质就是完成从面向业务过程…

[附源码]Python计算机毕业设计Django-菜篮子系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…