如何构建迭代器计算两个图像栈的所有图像对欧氏距离?
解决方案
用itertools.product生成两两组合
itertools.product并非只适用于字符串,它可以处理任何可迭代对象(包括numpy数组),用来生成两个集合的笛卡尔积(即a_stack里的每一张图和b_stack里的每一张图配对),完全匹配你的需求。
示例代码:
import itertools from scipy.spatial import distance as dist import numpy as np # 生成所有图像对的迭代器 image_pairs = itertools.product(a_stack, b_stack) # 遍历计算每对图像的欧氏距离 distances = [] for a_img, b_img in image_pairs: dist_val = dist.euclidean(a_img.flatten(), b_img.flatten()) distances.append(dist_val) # 转换成(200, 200)的矩阵,方便索引(distances[i][j]对应a_stack[i]和b_stack[j]的距离) distances = np.array(distances).reshape(200, 200)
更高效的向量化计算(推荐)
面对200*200=40000次循环,Python原生循环效率偏低。可以用numpy和scipy的向量化方法直接计算,底层基于C实现,速度提升明显:
import numpy as np from scipy.spatial.distance import cdist # 将图像栈展平为二维矩阵:(图像数量, 像素总个数),此处300*300*3=270000 a_flat = a_stack.reshape(a_stack.shape[0], -1) b_flat = b_stack.reshape(b_stack.shape[0], -1) # 直接计算所有两两欧氏距离,结果为(200, 200)的矩阵 distances_matrix = cdist(a_flat, b_flat, metric='euclidean')
这个方法无需手动构建迭代器,一步即可得到所有距离的矩阵,效率远高于循环实现。
内容的提问来源于stack exchange,提问作者DrBwts
相关产品推荐
相关产品推荐

