canny边缘检测的接口在opencv中给出,直接调用:
ret = cv2.canny(img,t1,t2)
您可以获取边缘检测结果. 其中,t1,t2是需要手动设置的阈值. 许多文献研究了自动阈值设置方法,即该算法可以在运行过程中自适应地找到更好的分割阈值t1
本文基于python3,并复制了一种自适应阈值分割方法.
输入图片为:
输出结果的比较如下: 左图直接使用canny,右图使用本文程序进行自适应分割.
缺点是它是自下而上重写的改进的自适应阈值canny边缘检测,包括非最大抑制之类的过程. . 消耗能量需要很长时间. 上面的输入图像需要27.38s. 我不知道其他学者如何研究自适应阈值Canny边缘检测方法的耗时情况. . 下采样已在程序的预处理过程中完成. 如果没有下采样,则将花费更长的时间.
以下代码:
主程序. py:
import numpy as np
import cv2, time, math
from scipy.signal import convolve2d as conv2
from matplotlib import pyplot as plt
from bilateralfilt import bilatfilt
from dog import deroGauss
import time
#...........................................................................................
def get_edges(I,sd):
dim = I.shape
Idog2d = np.zeros((nang,dim[0],dim[1]))
for i in range(nang):
dog2d = deroGauss(5,sd,angles[i])
Idog2dtemp = abs(conv2(I,dog2d,mode='same',boundary='fill'))
Idog2dtemp[Idog2dtemp<0]=0
Idog2d[i,:,:] = Idog2dtemp
return Idog2d
#...........................................................................................
def nonmaxsup(I,gradang):
dim = I.shape
Inms = np.zeros(dim)
xshift = int(np.round(math.cos(gradang*np.pi/180)))
yshift = int(np.round(math.sin(gradang*np.pi/180)))
Ipad = np.pad(I,(1,),'constant