在NumPy数组中根据指定Cx、Cy提取对应行/列像素值的技术问询
嘿,我来帮你搞定在NumPy数组里提取指定中心坐标对应像素行、列值的需求~
解决NumPy数组中按中心坐标区间提取像素行列值的问题
先明确术语定义
- Cx, Cy:目标区域的中心X、Y坐标
- Row P, Col P:对应像素点的行、列索引值
需求说明
我们需要从NumPy数组中筛选出满足以下条件的样本:
Cx处于
min(Cx)±10的区间内,同时Cy处于min(Cy)±10的区间内,然后返回对应的RowP和ColP值。
示例预期:当满足条件时,输出结果为 cX=298,cY=270,RowP=842,ColP=505
实现方案
我会提供两种常见数据存储形式的实现代码,你可以根据自己的实际情况选择:
方案1:使用结构化NumPy数组(推荐,数据关联性更强)
结构化数组可以把每组Cx、Cy、RowP、ColP作为一个整体存储,方便按字段访问:
import numpy as np # 模拟你的数据集(替换成你实际的数据) data = np.array([ (298, 270, 842, 505), (310, 280, 850, 510), (305, 275, 845, 508), (350, 300, 880, 530) ], dtype=[('Cx', int), ('Cy', int), ('RowP', int), ('ColP', int)]) # 计算Cx和Cy的最小值 min_cx = data['Cx'].min() min_cy = data['Cy'].min() # 定义筛选条件:同时满足Cx和Cy的区间要求 filter_mask = ( (data['Cx'] >= min_cx - 10) & (data['Cx'] <= min_cx + 10) & (data['Cy'] >= min_cy - 10) & (data['Cy'] <= min_cy + 10) ) # 筛选出符合条件的数据 filtered_samples = data[filter_mask] # 遍历输出结果(如果有多个符合条件的样本,会全部输出) for sample in filtered_samples: print(f"cX={sample['Cx']}, cY={sample['Cy']}, RowP={sample['RowP']}, ColP={sample['ColP']}")
方案2:使用独立的NumPy数组
如果你的Cx、Cy、RowP、ColP是分开存储的独立数组,可以用下面的代码:
import numpy as np # 模拟独立数组形式的数据集(替换成你实际的数据) Cx = np.array([298, 310, 285, 350]) Cy = np.array([270, 280, 265, 300]) RowP = np.array([842, 850, 835, 880]) ColP = np.array([505, 510, 498, 530]) # 计算最小值 min_cx = Cx.min() min_cy = Cy.min() # 生成筛选掩码 filter_mask = ( (Cx >= min_cx - 10) & (Cx <= min_cx + 10) & (Cy >= min_cy - 10) & (Cy <= min_cy + 10) ) # 提取符合条件的对应值 selected_Cx = Cx[filter_mask] selected_Cy = Cy[filter_mask] selected_RowP = RowP[filter_mask] selected_ColP = ColP[filter_mask] # 输出结果 for cx, cy, rowp, colp in zip(selected_Cx, selected_Cy, selected_RowP, selected_ColP): print(f"cX={cx}, cY={cy}, RowP={rowp}, ColP={colp}")
结果验证
在方案1的模拟数据中,min(Cx)=298,min(Cy)=270,对应的区间是288≤Cx≤308、260≤Cy≤280,符合条件的样本会被筛选出来,其中就包含你预期的cX=298,cY=270,RowP=842,ColP=505。
内容的提问来源于stack exchange,提问作者Pranav Arora
相关产品推荐
相关产品推荐

