极大值抑制使用的是线性插值的方式,不是简单的分为8个方向块,但是我没有考虑外围一圈,太麻烦了不说外圈效果也很难看的出来,感兴趣的自己加上去吧。
双阈值检测遍历一定是边的点,循环进行进出栈操作,最后再循环过滤一遍
canny算法的具体原理就不说了,直接上代码
import numpy as np
import matplotlib.pyplot as plt
import math
if __name__ == '__main__':
pic_path = 'C:/Users/Echo/Desktop/python_file/canny_project/yu_qian.jpeg' # 路径根据实际情况更改
img = plt.imread(pic_path)
if pic_path[-4:] == '.png': # .png图片在这里的存储格式是0到1的浮点数,所以要扩展到255再计算
img = img * 255 # 还是浮点数类型
img = img.mean(axis=-1) # 取均值就是灰度化了
# 1、高斯平滑
sigma = 1.52 # 高斯平滑时的高斯核参数,标准差,可调
dim = int(np.round(6 * sigma + 1)) # round是四舍五入函数,根据标准差求高斯核是几乘几的,也就是维度
if dim % 2 == 0: # 最好是奇数,不是的话加一
dim += 1
Gaussian_filter = np.zeros([dim, dim]) # 存储高斯核,这是数组不是列表了!
tmp = [i-dim//2 for i in range(dim)] # 生成一个序列
n1 = 1/(2*math.pi*sigma**2) # 计算高斯核
n2 = -1/(2*sigma**2)
for i in range(dim):
for j in range(dim):
Gaussian_filter[i, j] = n1*math.exp(n2*(tmp[i]**2+tmp[j]**2))
Gaussian_filter = Gaussian_filter / Gaussian_filter.sum()
dx, dy = img.shape
img_new = np.zeros(img.shape) # 存储平滑之后的图像,zeros