如何在两个二维numpy数组中查找相同/相近的BGR值?
查找Numpy数组中的相同值与相近值
一、查找并统计相同值
要忽略顺序在两个数组中定位相同的BGR值,可以将数组元素转换为可哈希的元组,通过集合交集操作快速筛选,最后统计数量即可。
示例代码:
import numpy as np arr1 = np.array([[159, 102, 66], [151, 92, 58], [155, 96, 62]]) arr2 = np.array([[161, 104, 68], [159, 102, 66], [159, 101, 67]]) # 将数组行转为元组,用于集合操作 set1 = set(tuple(row) for row in arr1) set2 = set(tuple(row) for row in arr2) # 求两个集合的交集,得到相同值 common_values = set1 & set2 # 统计相同值的数量 count_common = len(common_values) print(f"相同值:{list(common_values)}") print(f"相同值数量:{count_common}")
运行输出:
相同值:[(159, 102, 66)]
相同值数量:1
二、查找并统计相近值
相近值的判定需要先定义“相近”的标准,常用的方式是计算BGR值之间的欧氏距离,当距离小于设定阈值时,就认为两个值相近。如果需要更贴合人眼视觉感知,也可以将BGR转换为Lab色彩空间后再计算距离。
基于欧氏距离的示例代码
import numpy as np arr1 = np.array([[159, 102, 66], [151, 92, 58], [155, 96, 62]]) arr2 = np.array([[161, 104, 68], [159, 102, 66], [159, 101, 67]]) # 定义相近阈值(可根据需求调整) threshold = 2 # 计算arr1中每个元素与arr2中所有元素的欧氏距离 distances = np.sqrt(np.sum((arr1[:, np.newaxis] - arr2)**2, axis=2)) # 筛选出距离小于阈值但非完全相同的配对 is_close = (distances < threshold) & (distances != 0) # 统计相近值的配对数量 count_close = np.sum(is_close) # 统计不重复的相近值数量(避免同一元素被多次计数) unique_matches = np.union1d(np.where(is_close)[0], np.where(is_close)[1]) count_unique_close = len(unique_matches) print(f"相近值配对数量:{count_close}") print(f"不重复的相近值数量:{count_unique_close}")
代码说明:[159,102,66]与[159,101,67]的欧氏距离为√(0²+(-1)²+1²)=√2≈1.414,小于阈值2,会被判定为相近值。
内容的提问来源于stack exchange,提问作者Mert Can Basut
相关产品推荐
相关产品推荐

