如何在不失真的情况下将 Python DF 热图叠加在现有图像上

how to superimpose a python df heatmap over an existing image without distortion

提问人:RobinC 提问时间:11/9/2023 更新时间:11/9/2023 访问量:7

问:

我有一张现有的图像,从那里我知道像素大小。而且我知道我的“源”(蓝图中的橙色十字)在 x,y 像素坐标中的位置,使用 Paint。我根据与源的距离计算源强度,并将其放在我制作热图的数据帧中。但是,叠加两个图像后,源的位置在 x 和 y 方向(高和向右)上都偏离了,并且源强度模式应该是圆形的,但事实并非如此。

如何避免热图失真,并使原始图像中的源与热图中的热点匹配?

我使用的代码:

width, height = Image.open(image_path1).size

tmp_strengths = []
# location of source(s) in pixel values:
xs = [934]
ys = [710]
sourcestrength = [10000]

my_dpi=96
plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi)

# create 2D array and fill it up with "1" values - value is unimportant at this point:
x = np.full((width, height), 1)

for i in range(len(x[0])):
    for j in range(len(x[0])):
        # for z sources do:
        for z in range(len(xs)):
            #source strength = source strength - distance²
            strength = sourcestrength[z] - (math.sqrt(((ys[z]-j)**2)+((xs[z]-i)**2)))**2
            if strength < 0:
                strength = 0
                
            tmp_strengths.append(strength)
        
        x[j][i] = sum(tmp_strengths)
        
        # clean the tmp strength list again for the next i/j pairs
        tmp_strengths = []     
        

df = pd.DataFrame(x)
p1 = sns.heatmap(df, xticklabels=False, yticklabels=False, cbar=False, cmap = sns.cm.rocket_r)
p1.figure.savefig(heatmap_path,bbox_inches='tight', pad_inches=0, dpi=my_dpi)

img = Image.open(heatmap_path)
newsize = (width, height)
img = img.resize(newsize)
img.save(str(heatmap_path).replace('.jpg','_2.jpg'))

background = Image.open(image_path1)
overlay = Image.open(image_path2)

background = background.convert("RGBA")
overlay = overlay.convert("RGBA")

new_img = Image.blend(background, overlay, 0.5)
new_img.save(r"C:\Superimposed.png","PNG")

保留颜色条可以减少失真效果,但热图本身与原始图像的重叠当然不再匹配。

即使我使用了 plt.figure(figsize=(width/my_dpi, height/my_dpi), dpi=my_dpi),我仍然必须调整图像大小,因为创建的图像(1162x921 像素)与原始图像的像素大小(1500x1220 像素)不匹配。

带彩条的叠加图像

不带彩条的叠加图像

欢迎任何想法。

Python 数据帧 调整大小 热图 叠加

评论


答: 暂无答案