根据具体任务给点云每个点打分之后(比如saliency map),如果直接使用热力图给点赋值的效果
此时的直方图为 参考图像领域的直方图均衡化,效果如下: 直方图如下: 代码:
import matplotlib.pyplot as plt
import matplotlib as mpl
from matplotlib.ticker import FuncFormatter
from skimage import data,exposure
import pyvista as pv #点云可视化库
# 可视化直方图分布
def cum_prob_curve(data,bins,title,xlabel,pic_path):
'''
绘制概率分布直方图和累计概率分布曲线
'''
fig= plt.figure(figsize=(8, 4),dpi=100)
# 设置图形的显示风格
plt.style.use('ggplot')
# 中文和负号的正常显示
mpl.rcParams['font.sans-serif'] = ['Times New Roman']
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False
ax1 = fig.add_subplot(111)
##概率分布直方图
a1,a2,a3=ax1.hist(data,bins =bins, alpha = 0.65,density=1,edgecolor='k', stacked=True)
##累计概率曲线
#生成累计概率曲线的横坐标
indexs=[]
a2=a2.tolist()
for i,value in enumerate(a2):
if i<=len(a2)-2:
index=(a2[i]+a2[i+1])/2
indexs.append(index)
#生成累计概率曲线的纵坐标
def to_percent(temp,position):
return '%1.0f'%(100*temp) + '%'
dis=a2[1]-a2[0]
freq=[f*dis for f in a1]
acc_freq=[]
for i in range(0,len(freq)):
if i==0:
temp=freq[0]
else:
temp=sum(freq[:i+1])
acc_freq.append(temp)
#这是双坐标关键一步
ax2=ax1.twinx()
#绘制累计概率曲线
ax2.plot(indexs,acc_freq)
#设置累计概率曲线纵轴为百分比格式
ax2.yaxis.set_major_formatter(FuncFormatter(to_percent))
ax1.set_xlabel(xlabel,fontsize=8)
ax1.set_title(title,fontsize =8)
#把x轴的刻度间隔设置为1,并存在变量里
# x_major_locator=MultipleLocator(xlocator)
# ax1.xaxis.set_major_locator(x_major_locator)
ax1.set_ylabel('频率/组距',fontsize=8)
ax2.set_ylabel("累计频率",fontsize=8)
#plt.savefig(pic_path,format='png', dpi=300)
plt.show()
if __name__=='__main__':
#归一化
_range = np.max(sscore) - np.min(sscore)
sscore = (sscore - np.min(sscore)) / _range
#可视化直方图
cum_prob_curve(sscore, bins=200, title='test', xlabel='score', pic_path='./tt')
sscore = exposure.equalize_hist(sscore) # 均衡化
cum_prob_curve(sscore, bins=200, title='test', xlabel='score', pic_path='./tt')
saliency_point = pointclouds_pl_adv
# 可视化点云
p = pv.Plotter()
for i in range(len(saliency_point)):
p.add_mesh(pv.PolyData(saliency_point[i]), color=[sscore[i] ,0.4 * sscore[i], 1 - 0.5 * sscore[i]], point_size=np.float(11), render_points_as_spheres=True)
p.add_background_image('D:\\Desktop\\w.jpg')
p.show()
|