Python+OpenCV实现边缘检测与角点检测详解

 更新时间:2023年02月03日 08:39:56   作者:编程爱好者-阿新  
这篇文章主要为大家详细介绍了如何通过Python+OpenCV实现边缘检测与角点检测,文中的示例代码讲解详细,对我们学习Python与OpenCV有一定的帮助,需要的可以参考一下

一、边缘检测

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边缘检测的优缺点

sobel:

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

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

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角点检测算子的优缺点

Harris:

Harris优点:

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

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

Harris缺点:

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

2 提取的角点是像素级的

Susan:

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

以上就是Python+OpenCV实现边缘检测与角点检测详解的详细内容,更多关于Python OpenCV边缘 角点检测的资料请关注脚本之家其它相关文章!

相关文章

  • Python实现双向链表

    Python实现双向链表

    这篇文章主要为大家详细介绍了Python实现双向链表,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • Python新手入门之解释器的安装

    Python新手入门之解释器的安装

    相信有很多小伙伴还不会安装Python解释器,今天特地整理了本篇文章,文章有非常详细的图文示例,对不会安装的小伙伴很有帮助,需要的朋友可以参考下
    2021-06-06
  • Python使用Socket(Https)Post登录百度的实现代码

    Python使用Socket(Https)Post登录百度的实现代码

    以前都是用一些高级模块,封装的比较好,今天尝试使用socket模块登录百度,弄了半天才弄好,主要由于百度在登陆页使用了https,我们需要对socket进行一定处理
    2012-05-05
  • Python 中的 dataclass使用场景与代码示例详解

    Python 中的 dataclass使用场景与代码示例详解

    在Python中,dataclass是一个装饰器,用于简化类的定义,自动生成初始化、比较等方法,适用于需要存储数据的场景,通过示例展示了dataclass的基本用法,感兴趣的朋友跟随小编一起看看吧
    2024-09-09
  • django实现HttpResponse返回json数据为中文

    django实现HttpResponse返回json数据为中文

    这篇文章主要介绍了django实现HttpResponse返回json数据为中文,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python之site-packages目录的位置

    Python之site-packages目录的位置

    这篇文章主要介绍了Python之site-packages目录的位置,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 用python画个奥运五环(附完整代码)

    用python画个奥运五环(附完整代码)

    大家好,本篇文章主要讲的是用python画个奥运五环(附完整代码),感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • python可视化分析的实现(matplotlib、seaborn、ggplot2)

    python可视化分析的实现(matplotlib、seaborn、ggplot2)

    这篇文章主要介绍了python可视化分析的实现(matplotlib、seaborn、ggplot2),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python字典dict常用内置函数详解

    Python字典dict常用内置函数详解

    这篇文章主要介绍了Python字典dict常用内置函数详解,dict是Python中的一种内置数据类型,它是一种键值对的集合,类似于Java中的Map或其他语言中的字典,需要的朋友可以参考下
    2023-07-07
  • python 计算数据偏差和峰度的方法

    python 计算数据偏差和峰度的方法

    今天小编就为大家分享一篇python 计算数据偏差和峰度的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-06-06

最新评论