首页IT科技边缘检测的目的有哪些(边缘检测与角点检测(模式识别与图像处理课程作业))

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

时间2025-05-04 22:31:21分类IT科技浏览5073
导读:一、边缘检测 Sobel与Canny边缘检测代码如下所示...

一            、边缘检测

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检测算子能提供不依赖于模板尺寸的边缘精度         。

声明:本站所有文章               ,如无特殊说明或标注                    ,均为本站原创发布       。任何个人或组织   ,在未征得本站同意时            ,禁止复制      、盗用                   、采集              、发布本站内容到任何网站   、书籍等各类媒体平台                    。如若本站内容侵犯了原著者的合法权益                    ,可联系我们进行处理            。

创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!

展开全文READ MORE
vue watch监听vuex数据(Vue2 watch监听对象的属性值变化) python 类变量和类方法(Python实现类别变量的独热编码(One-hot Encoding))