寻求2D轮廓的平均表示及方差可视化技术方案
小鼠耳部轮廓的平均化与方差可视化方案
研究背景
在实验室开展小鼠行为学研究,目标是展示特定刺激如何引发小鼠耳朵产生可预测的运动。已开发脚本从21帧视频中分割耳部区域并提取轮廓;将刺激前(红色)、刺激后(蓝色)的轮廓叠加后,可观察到耳部形状/朝向的整体差异。
可视化优化需求
- 为刺激前、刺激后两类轮廓分别生成平均轮廓,替代杂乱的21条原始轮廓
- 同时展示每类轮廓的方差分布,参考1D时间序列的可视化形式:以平均曲线为中心,用灰色背景表示方差范围
核心挑战
与1D时间序列不同,耳部轮廓存在两个关键问题:
- 不同轮廓的坐标点之间没有一一对应的索引关系
- 不同轮廓的坐标点数量因尺寸、形状差异而不一致
现有思路尝试
扇区映射法
计算蓝色轮廓的质心(CoM),以质心为中心划分多个小扇区作为参考索引:
- 将每个扇区内的所有坐标点取平均,得到该扇区对应的单个坐标
- 遍历所有扇区,拼接得到平均轮廓
- 计算每个扇区的方差,以切线方向的灰条展示离散程度
- 存在问题:生成的灰条平滑度不足
点云拟合法
将轮廓视为2D点云,寻找能最佳拟合该点云的单一轮廓
- 存在问题:无法简单推导方差的可视化方式
示例代码:生成近似对齐的圆形轮廓
import numpy as np import matplotlib.pyplot as plt #generate some ovals num_ovals = 4 points = [] disp = np.random.rand(num_ovals, 2) * 0.5 # random displacements for _ in range(num_ovals): center = np.random.rand(2) * 0.05 d_x = 1 + np.random.rand() * 0.5 # Dilation noise x d_y = 1 + np.random.rand() * 0.5 # Dilation noise y angle = np.random.rand() * 0.2 # Angle offset # generate with random dilation t = np.linspace(0, 2 * np.pi, 100) x = center[0] + d_x * 2 * np.cos(t) y = center[1] + d_y * np.sin(t) # apply random displacement x += disp[_][0] y += disp[_][1] # apply random rotations rotation_matrix = np.array([[np.cos(angle), -np.sin(angle)], [np.sin(angle), np.cos(angle)]]) points.append(np.dot(np.vstack((x, y)).T - center, rotation_matrix) + center) comX, comY = np.mean(np.vstack(points), axis=0).T #center of mass #plot figure plt.figure(figsize=(8, 8)) for p in points: plt.plot(p[:, 0], p[:, 1], marker='.', markersize = 2) plt.plot(comX, comY, marker='x', markersize=10, color='red', label='Center of Mass') plt.legend() plt.gca().set_aspect('equal', adjustable='box') plt.show()
内容的提问来源于stack exchange,提问作者Brian Constantinescu
相关产品推荐
相关产品推荐

