边缘检测与角点检测(模式识别与图像处理课程作业)

news2024/12/27 17:37:16

边缘检测与角点检测(模式识别与图像处理课程作业)

  • 一、边缘检测
    • 1.1、读取图像
    • 1.2、图像转换成灰度图像
    • 1.3、Sobel算子
    • 1.4、Canny算子
    • 1.5、显示正常中文的标签
    • 1.6、边缘检测结果
  • 二、角点检测
    • 2.1、读取图像
    • 2.2、图像转换成灰度图像
    • 2.3、Harris算子
    • 2.4、设置阈值
    • 2.5、Susan算子
    • 2.6、图像转换成灰度图像
    • 2.7、调用susan角点检测算法
    • 2.8、调用img_revise()非极大值抑制修正
    • 2.9、显示正常中文的标签
    • 2.10、角点检测结果

在这里插入图片描述

一、边缘检测

在这里插入图片描述

Sobel与Canny边缘检测代码如下所示

import cv2 as cv
import matplotlib.pyplot as plt

1.1、读取图像

读取图像的代码如下所示

# 读取图像
img = cv.imread('Lena.jpg')
lenna_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

1.2、图像转换成灰度图像

图像转换成灰度图像的代码如下所示


# 图像转换成灰度图像
grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

1.3、Sobel算子

Sobel算子的代码如下所示

'''
    Sobel算子
'''
x = cv.Sobel(grayImage, cv.CV_16S, 1, 0)     # 对x求一阶导数
y = cv.Sobel(grayImage, cv.CV_16S, 0, 1)    # 对y求一阶导数

absX = cv.convertScaleAbs(x)
absY = cv.convertScaleAbs(y)

Sobel = cv.addWeighted(absX, 0.5, absY, 0.5, 0)

1.4、Canny算子

Canny算子的代码如下所示

'''
    Canny算子
'''

# 高斯滤波降噪
gaussian = cv.GaussianBlur(grayImage, (3, 3), 0)

# Canny算子
Canny = cv.Canny(gaussian, 50, 100)

1.5、显示正常中文的标签

显示正常中文的标签的代码如下所示

# 显示正常中文的标签
plt.rcParams['font.sans-serif'] = ['SimHei']

titles = [u'(a)原始图像', u'(b)Sobel图像', u'(c)Canny图像']
images = [lenna_img, Sobel, Canny]

for i in range(3):
    plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

1.6、边缘检测结果

边缘检测运行结果结果如下所示

在这里插入图片描述

Sobel与Canny边缘检测的优缺点

  1. sobel:
  • 1、sobel优点:输出图像(数组)的元素通常具有更大的绝对数值。
  • 2、sobel缺点:由于边缘是位置的标志,对灰度的变化不敏感。
  1. canny:
  • 1、canny优点:法能够尽可能多地标识出图像中的实际边缘;标识出的边缘要与实际图像中的实际边缘尽可能接近。
  • 2、canny缺点:图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。

二、角点检测

在这里插入图片描述

Susan与Harris角点检测代码如下所示

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

2.1、读取图像

读取图像的代码如下所示

# 读取图像
img = cv.imread('Lena.jpg')
lenna_img = cv.cvtColor(img, cv.COLOR_BGR2RGB)

2.2、图像转换成灰度图像

图像转换成灰度图像的代码如下所示

# 图像转换成灰度图像
grayImage = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
grayImage = np.float32(grayImage)

2.3、Harris算子

Harris算子的代码如下所示

'''
    Harris算子
'''
harrisImage = cv.cornerHarris(grayImage, 2, 3, 0.04)

harrisImage = cv.dilate(harrisImage, None)

2.4、设置阈值

设置阈值的代码如下所示


# 设置阈值
thresImage = 0.006 * harrisImage.max()

img[harrisImage > thresImage] = [255, 0, 0]

2.5、Susan算子

Susan算子的代码如下所示

'''
    Susan算子
'''
def img_extraction(image):
    """
        img_extraction 函数利用susan角点检测算法,对图像进行处理
    """
    print("最小灰度值,%d" % image.min())
    print("最大灰度值,%d" % image.max())
    threshold_value = (int(image.max())-int(image.min())) / 10
    print("初始阈值为: %d" % threshold_value)

    offsetX = [
                -1, 0, 1,
            -2, -1, 0, 1, 2,
        -3, -2, -1, 0, 1, 2, 3,
        -3, -2, -1, 0, 1, 2, 3,
        -3, -2, -1, 0, 1, 2, 3,
            -2, -1, 0, 1, 2,
                -1, 0, 1
        ]
    offsetY = [
                -3, -3, -3,
            -2, -2, -2, -2, -2,
        -1, -1, -1, -1, -1, -1, -1,
             0, 0, 0, 0, 0, 0, 0,
             1, 1, 1, 1, 1, 1, 1,
                2, 2, 2, 2, 2,
                   3, 3, 3
        ]

    for i in range(3, image.shape[0] - 3):     # 利用圆形模板遍历图像,计算每点处的USAN值
        for j in range(3, image.shape[1] - 3):
            same = 0
            for k in range(0, 37):
                if abs(int(image[i + int(offsetY[k]), j + int(offsetX[k]), 0]) - int(image[i, j, 0])) < threshold_value:             # 计算相似度
                        same += 1

            if same < 18:
                image[i, j, 0] = 18 - same
                image[i, j, 1] = 18 - same
                image[i, j, 2] = 18 - same
            else:
                image[i, j, 0] = 0
                image[i, j, 1] = 0
                image[i, j, 2] = 0

    return image

def img_revise(image):
    """
        img_revise 函数用于对角点处理后的图像,进行非极大值抑制修正
    """

    X = [-1, -1, -1, 0, 0, 1, 1, 1]     # X轴偏移
    Y = [-1, 0, 1, -1, 1, -1, 0, 1]     # Y轴偏移
    for i in range(4, image.shape[0]-4):
        for j in range(4, image.shape[1]-4):
            flag = 0
            for k in range(0, 8):
                print(i)
                if image[i, j, 0] <= image[int(i + X[k]), int(j + Y[k]), 0]:
                    flag += 1
                    break

            if flag == 0:       # 判断是否是周围8个点中最大的值,是则保留
                image[i, j, 0] = 255
                image[i, j, 1] = 255
                image[i, j, 2] = 255
            else:
                image[i, j, 0] = 0
                image[i, j, 1] = 0
                image[i, j, 2] = 0

    return image

originImage = cv.imread('Lena.jpg')
originImage = cv.cvtColor(originImage, cv.COLOR_BGR2RGB)

2.6、图像转换成灰度图像

图像转换成灰度图像的代码如下所示

# 图像转换成灰度图像
grayImage = np.float32(originImage)

2.7、调用susan角点检测算法

调用susan角点检测算法的代码如下所示

# 调用susan角点检测算法
extraImage = img_extraction(originImage)

2.8、调用img_revise()非极大值抑制修正

调用img_revise()非极大值抑制修正的代码如下所示

# 调用img_revise()非极大值抑制修正
susanImages = img_revise(extraImage)

2.9、显示正常中文的标签

显示正常中文的标签的代码如下所示

# 显示正常中文的标签
plt.rcParams['font.sans-serif'] = ['SimHei']

titles = [u'(a)原始图像', u'(b)Harris图像', u'(c)Susan图像']
images = [lenna_img, img, susanImages]

for i in range(3):
    plt.subplot(1, 3, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i])
    plt.xticks([]), plt.yticks([])
plt.show()

2.10、角点检测结果

角点检测运行结果结果如下所示

在这里插入图片描述

Susan与Harris角点检测算子的优缺点

  1. Harris:
  • Harris优点:
  • 1 旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)
  • 2 对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;对于图像灰度尺度变化不变
  • Harris缺点:
  • 1 对尺度很敏感,不具备几何尺度不变性。
  • 2 提取的角点是像素级的
  1. Susan:
  • Susan优点:大多数的边缘检测算子会随所用模板尺寸的变化而改变其所检测出的边缘的位置,但SUSAN检测算子能提供不依赖于模板尺寸的边缘精度。
    在这里插入图片描述

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

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

相关文章

HTTPTunnel测试

介绍 HTTPTunnel是一个隧道软件。通过http的GET和POST请求隐藏隧道内的流量。适用于有网络封锁的环境&#xff0c;比如防火墙仅允许80端口数据包通过&#xff0c;内部终端访问外部其他应用时&#xff0c;或者渗透测试时访问内部目标服务器的其他业务端口时&#xff0c;都可以通…

MySQL多表操作案例练习

目录 准备 需求 代码 准备 -- 创建test1数据库 create database test1; -- 选择使用test1数据库 use test1; -- 创建部门表 create table dept(deptno int primary key,-- 部门编号dname varchar(14) ,-- 部门名称loc varchar(13) -- 部门地址 ) ;insert into dept values(…

【Rust】19. 模式与模式匹配

19.1 所有可能会用到模式的位置 19.1.1 match 分支 19.1.2 if let 条件表达式 可以组合并匹配 if let、else if 和 else if let 表达式&#xff0c;优势在于可以将多个值与模式比较&#xff08;match 表达式一次只能将一个值与模式比较&#xff09;&#xff0c;且各个分支并不…

[NOI Online 2022 入门组] 王国比赛

题目背景&#xff1a; 经过管理员的考虑&#xff0c;我们打算将民间数据单独存放在最后一个 Subtask 中。这些测试点分数均为 0 分&#xff0c;但是没有通过其中的任何测试点将会视为此题不通过。 民间数据提供者&#xff1a;一扶苏一。 题目描述&#xff1a; 智慧之王 Kri …

C++八数码程序图形化界面[2023-02-02]

C八数码程序图形化界面[2023-02-02] 问题简介 八数码&#xff1a;是指在3x3的矩阵中&#xff0c;其中有8个格子放置成1-8&#xff0c;剩下一个格子是空格。能够移动和空格相邻的格子到空格&#xff0c;直到这个矩阵满足每一行依次从左到右读取是有序&#xff0c;得到最后得到1…

爱普生LQ-610K针式打印机不通电维修

基本参数: 爱普生LQ-610K是一台针式打印机,不支持网络打印,A4幅面,不支持自动双面打印。 品牌:爱普生Epson 型号:LQ-610K 颜色:灰色 类型:针式打印机 幅面:A4幅面 针数:24针 打印速度:中文(6.7cpi)150汉字/秒 100汉字/秒 (7.5cpi)168汉字/秒 112汉字/秒5…

【整理分享】一些常见Vue面试题(附答案解析)

本次给大家分享一些关于Vue的常见面试题&#xff0c;带你梳理基础知识&#xff0c;增强Vue知识储备&#xff0c;值得收藏&#xff0c;快来看看吧&#xff01; Vue 常见面试题总结 MVVM模型&#xff1f; MVVM&#xff0c;是Model-View-ViewModel的简写&#xff0c;其本质是MVC…

【Git笔记】GitHub创建远程库,推送到远程库,拉取到本地库与克隆到本地库

目录 创建 GitHub 远程库 创建远程库别名 推送本地库到远程库 拉取远程库到本地库 克隆远程库到本地库 创建 GitHub 远程库 点击 New repository Repository name 名字与工作区名称最好一致 Public 就是开源&#xff0c;Private 就是私有&#xff0c;不公开 其它的保持…

阿里二面:千万级、亿级数据,如何性能优化? 教科书级 答案来了

说在前面 在尼恩指导了几百个小伙伴的面试&#xff0c;在这些过程中&#xff0c; 非常、非常高频的一个面试题&#xff1a; 千万级数据&#xff0c;如何做性能优化&#xff1f; 亿级数据&#xff0c;如何做性能优化&#xff1f; 最近&#xff0c;有个小伙伴阿里二面&#xff0…

袁树雄有《早安隆回》,杨语莲有《汉川》,后者嫁给前者真是绝配

随着《早安隆回》的火爆&#xff0c;创作者袁树雄也收获颇丰&#xff0c;不但各种商演邀约不断&#xff0c;还坐到了春晚的观众席上。 、虽然对于袁树雄来说&#xff0c;他能够坐到观众席上面&#xff0c;就已经是一生的荣幸了&#xff0c;但是央视春晚纂改歌词&#xff0c;总是…

python time模块和datetime模块详解

一、time模块 time模块中时间表现的格式主要有三种&#xff1a; a、timestamp时间戳&#xff0c;时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量 b、struct_time时间元组&#xff0c;共有九个元素组。 c、format time 格式化时间&#xff0c;已格式化的结构使时间更…

【生产者消费者模型】

Linux生产者消费者模型生产者消费者模型生产者消费者模型的概念生产者消费者模型的特点生产者消费者模型优点基于BlockingQueue的生产者消费者模型基于阻塞队列的生产者消费者模型模拟实现基于阻塞队列的生产消费模型生产者消费者模型 生产者消费者模型的概念 生产者消费者模式…

剑指 Offer 第19天 二叉树的公共祖先

目录 剑指 Offer 68 - I. 二叉搜索树的最近公共祖先 剑指 Offer 68 - II. 二叉树的最近公共祖先 a 小部件 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表…

基于 JMeter 完成 Dubbo 接口的测试

JMeter 默认是不支持 Dubbo 接口测试的&#xff0c;但是我们可以通过拓展的插件或 jar 包实现此功能。 JMeter 插件拓展 1.1 插件下载 测试 Dubbo&#xff0c;我们需要下载 Dubbo 的插件&#xff0c;在 Apache 的 Dubbo 插件 GitHub 中可以找到&#xff1a; https://github…

DDR调试不通?先别扔,这个操作可能帮你逆袭!

作者&#xff1a;一博科技高速先生成员 黄刚相信大家过完一个美美的春节后&#xff0c;学习的热情一定会暴涨&#xff0c;反正高速先生给大家分享技术文章的热情是非常高涨的哈&#xff01;打从推出这个系列的仿真和理论相结合的话题后&#xff0c;文章受到了很多忠实粉丝的喜爱…

ThinkPHP6 获取上传文件属性及自定义文件验证及上传处理

TP^6.1文件上传有封装方法&#xff0c;如果不想用封装的&#xff0c;自定义上传怎么获取文件属性呢 目录 TP文件信息 打印上传文件信息 获取文件属性方法 1.获取文件大小&#xff08;单位bytes&#xff09; 2.获取文件后缀 3.获取文件上传路径 4.获取文件名称 5.上传文…

XSS Challenges通关教程

11.XSS Challenges通关教程 Stage#1 直接在search 输入框中输入payload&#xff1a; <script>alert(document.domain)</script> 点击search就XSS攻击成功了。 Stage #2 尝试直接输入<script>alert(document.domain)</script>&#xff0c;发现并未…

【2005NOIP普及组】T4.循环 代码解析

【2005NOIP普及组】T4.循环 代码解析 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。 众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,…

使用PyTorch构建卷积神经网络(CNN)源码(详细步骤讲解+注释版) 01 手写数字识别

1 卷积神经网络&#xff08;CNN&#xff09;简介 在使用PyTorch构建GAN生成对抗网络一文中&#xff0c;我们使用GAN构建了一个可以生成人脸图像的模型。但尽管是较为简单的模型&#xff0c;仍占用了1G左右的GPU内存&#xff0c;因此需要探索更加节约资源的方式。 卷积神经网络…

vue 文件.env.production、.env.development简析

静下来 慢慢看 首先 我们需要搭建一个项目 依赖包会自动下载好 无需自己 npm i .env 无论什么环境都会加载 .env.production 生产环境加载 .env.development 测试开发环境加载 我们下面的例子分开来写 只用 .env.production .env.development 在项目根目录新建两个文件 分别…