计算神经细胞分水岭种子图时遇XA需二维数组错误求助
神经细胞分水岭算法种子图生成中欧式距离计算报错排查
问题描述
在为神经细胞的分水岭算法生成种子图时,计算欧氏距离出现错误:
ValueError: XA must be a 2-dimensional array
尝试多种方案仍未解决,请求排查代码错误。
原代码
import numpy as np import os gvf = GVF(images, th) dismap = gvf.distancemap() newimg = gvf.new_image(0.4, dismap) # choose alpha as 0.4. out = [] pair = [] kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) for i,img in enumerate(dismap): neighborhood_size = 20 data_max = ndimage.filters.maximum_filter(img, neighborhood_size) data_max[data_max==0] = 255 pair.append((img == data_max).astype(np.uint8)) y, x = np.where(pair[i]>0) points = zip(y[:], x[:]) dmap = distance.cdist(points, points, 'euclidean') y, x = np.where(dmap<20) ps = zip(y[:], x[:]) for p in ps: if p[0] != p[1]: pair[i][points[min(p[0], p[1])]] = 0 dilation = cv2.dilate((pair[i]*255).astype(np.uint8),kernel,iterations = 1) out.append(dilation) os.chdir(".") write_mask8(dilation, "seed_point", i) out = cvt_npimg(out) vis_square(out)
错误原因与修复方案
核心错误点
报错源于distance.cdist(points, points, 'euclidean')这一行:
zip(y[:], x[:])返回的是迭代器对象,而非cdist要求的二维数组格式(每个元素为点坐标的N×2数组)。- 同时,后续代码中
points[min(p[0], p[1])]试图索引迭代器,这本身也是非法操作,会引发额外错误。
修复步骤
将点坐标转换为二维numpy数组
把points = zip(y[:], x[:])替换为:points = np.column_stack((y, x))np.column_stack会将y和x两个一维数组拼接成N行2列的二维数组,每一行对应一个点的(y, x)坐标,完全符合cdist的输入要求。调整点索引逻辑
原代码中pair[i][points[min(p[0], p[1])]] = 0在points变为numpy数组后可正常运行,因为数组支持索引访问。
修复后代码片段(关键修改处标注)
import numpy as np import os gvf = GVF(images, th) dismap = gvf.distancemap() newimg = gvf.new_image(0.4, dismap) # choose alpha as 0.4. out = [] pair = [] kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) for i,img in enumerate(dismap): neighborhood_size = 20 data_max = ndimage.filters.maximum_filter(img, neighborhood_size) data_max[data_max==0] = 255 pair.append((img == data_max).astype(np.uint8)) y, x = np.where(pair[i]>0) # --- 修改处:将点转换为二维numpy数组 --- points = np.column_stack((y, x)) dmap = distance.cdist(points, points, 'euclidean') y, x = np.where(dmap<20) ps = zip(y[:], x[:]) for p in ps: if p[0] != p[1]: # --- 此处points已为数组,可正常索引 --- pair[i][points[min(p[0], p[1])]] = 0 dilation = cv2.dilate((pair[i]*255).astype(np.uint8),kernel,iterations = 1) out.append(dilation) os.chdir(".") write_mask8(dilation, "seed_point", i) out = cvt_npimg(out) vis_square(out)
内容的提问来源于stack exchange,提问作者bahadur ali
相关产品推荐
相关产品推荐

