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

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

e7b10da6fea3479bb1ec0491011ab7c9.jpg

一、边缘检测


108d5351c0d8473aa111b9968f6bdbcb.jpg


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、边缘检测结果

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


093b7c67061047ec81f8242727f9b4ab.png

Sobel与Canny边缘检测的优缺点


sobel:

1、sobel优点:输出图像(数组)的元素通常具有更大的绝对数值。

2、sobel缺点:由于边缘是位置的标志,对灰度的变化不敏感。

canny:

1、canny优点:法能够尽可能多地标识出图像中的实际边缘;标识出的边缘要与实际图像中的实际边缘尽可能接近。

2、canny缺点:图像中的边缘只能标识一次,并且可能存在的图像噪声不应标识为边缘。


二、角点检测


3f9669c1398645c1be11796b551729dd.jpg


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、角点检测结果

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


852be20179ed4d14aae607f6a0a52c52.png

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


Harris:

Harris优点:

1 旋转不变性,椭圆转过一定角度但是其形状保持不变(特征值保持不变)

2 对于图像灰度的仿射变化具有部分的不变性,由于仅仅使用了图像的一介导数,对于图像灰度平移变化不变;对于图像灰度尺度变化不变

Harris缺点:

1 对尺度很敏感,不具备几何尺度不变性。

2 提取的角点是像素级的

Susan:

Susan优点:大多数的边缘检测算子会随所用模板尺寸的变化而改变其所检测出的边缘的位置,但SUSAN检测算子能提供不依赖于模板尺寸的边缘精度。



5793ac0701a64ed3bd562ee780c48896.jpg


相关文章
|
算法 计算机视觉
OpenCV(三十七):拟合直线、三角形和圆形
OpenCV(三十七):拟合直线、三角形和圆形
592 0
|
2月前
|
机器人 数据安全/隐私保护 Python
企业微信自动回复软件,企业微信自动回复机器人,python框架分享
企业微信机器人包含完整的消息处理流程,支持文本消息自动回复、事件处理、消息加密解密等功能
|
并行计算 PyTorch 测试技术
MMDetection系列 | 1. MMDetection安装流程与测试
MMDetection系列 | 1. MMDetection安装流程与测试
975 0
|
7月前
|
缓存 前端开发 安全
网站显示不安全的解决办法
当浏览器提示网站“不安全”时,通常是HTTPS配置或证书问题。解决方法包括:检查网址、验证证书状态(是否失效、域名匹配、CA受信任),确保证书链完整,避免自签名证书;解决混合内容问题,确保所有资源使用HTTPS;修正服务器配置,强制HTTP跳转HTTPS,启用TLS 1.2/1.3,添加HSTS;检查本地时间与浏览器缓存。按此步骤排查,可有效解决问题。
|
10月前
|
人工智能 安全 物联网
Linux操作系统的演变与未来:从开源精神到万物互联的基石###
本文是关于Linux操作系统的演变、现状与未来的深度探索。Linux,这一基于Unix的开源操作系统,自1991年由林纳斯·托瓦兹(Linus Torvalds)学生时代创造以来,已经彻底改变了我们的数字世界。文章首先追溯了Linux的起源,解析其作为开源项目的独特之处;随后,详细阐述了Linux如何从一个小众项目成长为全球最广泛采用的操作系统之一,特别是在服务器、云计算及嵌入式系统领域的主导地位。此外,文章还探讨了Linux在推动技术创新、促进协作开发模式以及保障信息安全方面的作用,最后展望了Linux在未来技术趋势中的角色,包括物联网、人工智能和量子计算等前沿领域的潜在影响。 ###
|
前端开发 JavaScript 安全
跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护
跨域问题与Django解决方案:深入解析跨域原理、请求处理与CSRF防护
|
存储 SQL 关系型数据库
MySQL5.7到8.0的升级迁移!高效的MySQL跨版本迁移技术解读
NineData是一种高效、稳定且易于使用的迁移工具,可帮助用户将MySQL 5.7迁移到MySQL 8.0。由于MySQL 5.7已经结束生命周期并不再获得技术支持,因此迁移至MySQL 8.0是必要的。NineData提供了数据复制功能,包括数据迁移和实时同步,还支持双向复制。与传统迁移方法相比,NineData具有简单易用、数据一致、强劲性能和高可靠性的优势。它提供了完善的观测和干预能力,保障迁移的成功。此外,NineData还提供了对比功能,确保数据的一致性。通过简单的配置过程,用户可以实现自动化的数据迁移。NineData还提供了完善的观测和干预能力,帮助用户追踪迁移进展并诊断和修复
1827 3
|
前端开发 测试技术
如何提交高质量的bug?附模板
如何提交高质量的bug?附模板
797 0
|
Java 索引 Python
深度总结 | Python编写规范
好的代码宛如艺术品,是具有工匠精神的,需要精雕细琢,能给读者带来美的享受,下面介绍一下Python的语言编写风格规范。
10588 2
|
存储
HVAC 电容器有什么作用?为什么会出现 故障?(更换提示)
HVAC 电容器是一种小型设备,对空调的可靠运行起着关键作用。它在制冷循环期间为空调提供能量。它具有非常高的电压和高电容,因此很危险。本文将简单介绍HVAC电容器的详细信息、如何检测故障电容器以及更换故障电容器的技巧。
837 0
HVAC 电容器有什么作用?为什么会出现 故障?(更换提示)

热门文章

最新文章