Python中Shi-Tomasi与corner_peaks报错AttributeError求助
解决Shi-Tomasi角点检测后调用corner_peaks的AttributeError问题
嘿,我看到你遇到的问题了,这个错误其实是个很常见的新手小失误——你不小心把函数名当成了变量传给corner_peaks啦!让我给你拆解一下问题,再把代码改对:
错误原因分析
你定义了一个名为corners_map的函数来生成Shi-Tomasi角点响应图,但在corner_peaks函数里,你直接写了feature.corner_peaks(corners_map)——这里传入的是函数对象,而不是corners_map函数运行后生成的角点响应数组。corner_peaks需要的是一个数值数组,它尝试对传入的函数调用.flat属性,自然就报错了。
另外你的代码还有几个小问题:
corner_peaks函数里用到的RGB和RGBimg没有定义,得从corners_map的结果或者原图像里获取- 画图的逻辑有点混乱,比如重复创建了figure
修正后的完整代码
from skimage import color, feature, img_as_float import matplotlib.pyplot as plt import matplotlib.cm as cm def get_corners_map(image): # 重命名函数,避免和变量名冲突 # 转灰度图并转为浮点型 gray_img = img_as_float(color.rgb2gray(image)) # 生成Shi-Tomasi角点响应图 corner_response = feature.corner_shi_tomasi(gray_img, 10) # 绘制响应图 plt.figure(figsize=(12,6)) plt.subplot(121) plt.imshow(gray_img, cmap=cm.gist_gray) plt.title('Original image') plt.subplot(122) plt.imshow(corner_response, cmap=cm.jet) plt.colorbar(orientation='horizontal') plt.title('Corners map') # 返回响应图和灰度图,供后续使用 return corner_response, gray_img def detect_corner_peaks(image): # 先调用函数获取角点响应图和灰度图 corner_response, gray_img = get_corners_map(image) # 传入响应图给corner_peaks corners = feature.corner_peaks(corner_response) # 绘制检测结果 plt.figure(figsize=(12,6)) plt.subplot(121) plt.imshow(gray_img, cmap=cm.gist_gray) plt.title('Original image') plt.subplot(122) plt.imshow(gray_img, cmap=cm.gist_gray) plt.scatter(corners[:,1], corners[:,0], s=30, c='red', marker='x') plt.title('skimage.feature.corner_peaks result') plt.show() # 调用示例(假设image1是你的输入图像) # detect_corner_peaks(image1)
关键修改点说明
- 函数名重命名:把原来的
corners_map改成get_corners_map,避免和生成的响应图变量名冲突,这是解决错误的核心 - 返回必要数据:让
get_corners_map返回角点响应图和灰度图,这样detect_corner_peaks就能直接使用这些变量,不用重新定义 - 正确传入参数:在
detect_corner_peaks里,把get_corners_map返回的corner_response(也就是角点响应数组)传给feature.corner_peaks - 修复绘图逻辑:统一了figure的创建,并且给散点图加了颜色和标记,让角点更明显
这样修改后,应该就能正常运行,不会再出现那个AttributeError啦!
内容的提问来源于stack exchange,提问作者MOA
相关产品推荐
相关产品推荐

