使用 Python 进行边缘检测( 二 )


希望上文已经讲清楚了这些理论!下面看一看代码是如何实现的 。
【使用 Python 进行边缘检测】如何进行边缘检测 —— 代码
首先进行一些设置:
%matplotlib inline import numpy as np import matplotlib.pyplot as plt # 定义纵向过滤器 vertical_filter = [[-1,-2,-1], [0,0,0], [1,2,1]] # 定义横向过滤器 horizontal_filter = [[-1,0,1], [-2,0,2], [-1,0,1]] # 读取纸风车的示例图片“pinwheel.jpg” img = plt.imread('pinwheel.jpg') # 得到图片的维数 n,m,d = img.shape # 初始化边缘图像 edges_img = img.copy()你可以把代码中的“pinwheel.jpg”替换成其它你想要找出边缘的图片文件!需要确保此文件和代码在同一工作目录中 。
接着编写边缘检测代码本身:
%matplotlib inline import numpy as np import matplotlib.pyplot as plt# 定义纵向过滤器 vertical_filter = [[-1,-2,-1], [0,0,0], [1,2,1]] # 定义横向过滤器 horizontal_filter = [[-1,0,1], [-2,0,2], [-1,0,1]] # 读取纸风车的示例图片“pinwheel.jpg” img = plt.imread('pinwheel.jpg') # 得到图片的维数 n,m,d = img.shape # 初始化边缘图像 edges_img = img.copy() # 循环遍历图片的全部像素 for row in range(3, n-2): for col in range(3, m-2):# 在当前位置创建一个 3x3 的小方框 local_pixels = img[row-1:row+2, col-1:col+2, 0]# 应用纵向过滤器 vertical_transformed_pixels = vertical_filter*local_pixels # 计算纵向边缘得分 vertical_score = vertical_transformed_pixels.sum()/4# 应用横向过滤器 horizontal_transformed_pixels = horizontal_filter*local_pixels # 计算横向边缘得分 horizontal_score = horizontal_transformed_pixels.sum()/4# 将纵向得分与横向得分结合 , 得到此像素总的边缘得分 edge_score = (vertical_score**2 + horizontal_score**2)**.5# 将边缘得分插入边缘图像中 edges_img[row, col] = [edge_score]*3 # 对边缘图像中的得分值归一化 , 防止得分超出 0-1 的范围 edges_img = edges_img/edges_img.max()有几点需要注意:
在图片的边界像素上 , 我们无法创建完整的 3 x 3 小方框 , 因此在图片的四周会有一个细边框 。
既然是同时检测水平方向和垂直方向的边缘 , 我们可以直接将原始的纵向得分与横向得分分别除以 4(而不像前文描述的分别加 4 再除以 8) 。 这个改动无伤大雅 , 反而可以更好地突出图像的边缘 。
将纵向得分与横向得分结合起来时 , 有可能会导致最终的边缘得分超出 0-1 的范围 , 因此最后还需要重新对最终得分进行标准化 。
在更复杂的图片上运行上述代码:
使用 Python 进行边缘检测文章插图
得到边缘检测的结果:
使用 Python 进行边缘检测文章插图
以上就是本文的全部内容了!希望你了解到了一点新知识


推荐阅读