边缘检测,如何细化边缘。

图片

例如提取图中物体边缘轮廓,如何细化边缘,保证图像矩阵每行只有一个边缘像素点(255),而其他非边缘像素全为0?因为实验要求,必须使用相位一致性边缘检测算法,实验图像大致和这个差不多,拍摄物体的某一规则边缘,边缘轮廓比较明显。求代码,matlab和python代码都可以。现在主要的问题是如何细化边缘,并排除非边缘部分的噪点干扰。

啊这,我这么说吧,现在商用领域也无法分别是噪声还是有用的边缘信号。

你这个问题可以做博士课题了。

 

说回你要实现的一个像素点的需求,这个需求还是可以实现的。

首先要明白,边缘不一定是一个像素,它是一个过渡带,一个过渡剧烈的过渡带。

所以你可以先边缘检测,检测结果每行应该有多个像素表示边缘。

一种方法是用检测结果腐蚀膨胀,保留一个像素就行。

第二种方法是把二值化后的边缘检测结果每行从左边遍历,遇到第一个不为0的点保留,之后的全部清0就行。

 

代码方面需要拿到图像的两种像素点数据进行对比,255是峰值,那么低于某值的数据全部赋值0即可。

先做个阈值分割,然后用3x3的均值滤波过滤一遍,像素值不等于0且不等于255的就是边缘,这个每行应该有三个像素是边缘,取中间那个像素作为边缘就可以了

def make_thresh(img):
    # global thresh
    thresh = 43
    print('Thress at: ', thresh)
    gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
    # Detect edges using Canny
    canny_output = cv.Canny(gray, thresh, thresh * 2)
    # Find contours
    conts, hierarchy = cv.findContours(canny_output, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE)
    # Draw contours
    drawing = np.zeros((canny_output.shape[0], canny_output.shape[1], 3), dtype=np.uint8)
    for i in range(len(conts)):
        color = (rng.randint(0, 256), rng.randint(0, 256), rng.randint(0, 256))
        cv.drawContours(drawing, conts, i, color, 2, cv.LINE_8, hierarchy, 0)
    # Show in a window
    return drawing

不多,几行而已。threshhold 最低是42.