例如提取图中物体边缘轮廓,如何细化边缘,保证图像矩阵每行只有一个边缘像素点(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.