我是Python新手。我的问题的答案可能在StackOverflow中可用,但老实说,我尝试了StackOverflow中几乎所有可用的代码和建议。
我的问题:几乎与此处描述的相同。我有坐标点(x
和y
)和相应的值(p
)作为.csv
文件。我正在使用读取该文件pandas
。
df = pd.read_csv("example.csv")
该example.csv
文件可以下载来自这里。让图像大小2000 x 2000
。
任务:
根据excel工作表中的x
和y
坐标点,我必须在该图像中定位该点。
LetsA
是一个图像,并且A(x,y)
是内的任何一点A
。现在我有以这样的方式来生成的热图,使得从50个像素x
和50个像素y
,即,A(X,Y),A(X + 50,Y),A(X,Y + 50)和A( x + 50,y + 50)包含p
对应的那个坐标点。
我发现此链接非常有用,可以解决我的问题,但是问题是我的数据集需要更多修改。
上面链接中提供的代码:
#!/usr/bin/python3
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from skimage import io
from skimage.color import rgb2gray
import matplotlib as mpl
# Read original image
img = io.imread('img.jpg')
# Get the dimensions of the original image
x_dim, y_dim, z_dim = np.shape(img)
# Create heatmap
heatmap = np.zeros((x_dim, y_dim), dtype=float)
# Read CSV with a Pandas DataFrame
df = pd.read_csv("data.csv")
# Set probabilities values to specific indexes in the heatmap
for index, row in df.iterrows():
x = np.int(row["x"])
y = np.int(row["y"])
x1 = np.int(row["x1"])
y1 = np.int(row["y1"])
p = row["Probability value"]
heatmap[x:x1,y:y1] = p
# Plot images
fig, axes = plt.subplots(1, 2, figsize=(8, 4))
ax = axes.ravel()
ax[0].imshow(img)
ax[0].set_title("Original")
fig.colorbar(ax[0].imshow(img), ax=ax[0])
ax[1].imshow(img, vmin=0, vmax=1)
ax[1].imshow(heatmap, alpha=.5, cmap='jet')
ax[1].set_title("Original + heatmap")
# Specific colorbar
norm = mpl.colors.Normalize(vmin=0,vmax=2)
N = 11
cmap = plt.get_cmap('jet',N)
sm = plt.cm.ScalarMappable(cmap=cmap, norm=norm)
sm.set_array([])
plt.colorbar(sm, ticks=np.linspace(0,1,N),
boundaries=np.arange(0,1.1,0.1))
fig.tight_layout()
plt.show()
使用此代码时我面临的问题:
这段代码正在生成正方形边缘的热图,但我期望边缘平滑。我知道高斯分布可能会解决此问题。但是我是python的新手,我不知道如何在数据集中实现高斯分布。
不属于坐标点的区域也会生成一层颜色。结果是覆盖了图像的那些层覆盖了原始图像的背景。我希望用一句话说明热图的背景是透明的,以便覆盖在显示坐标点未覆盖的区域时不会造成任何问题。
任何线索将不胜感激。
您的代码是完美的。只需更改一行,即可解决您的两个问题。
更改前:
ax[1].imshow(heatmap, alpha=.5, cmap='jet')
更改后:
ax[1].imshow(heatmap, alpha=.5, cmap='coolwarm', interpolation='gaussian')
尽管上面的更改可以解决您的问题,但是如果您想获得更高的透明度,则可以使用以下功能
def transparent_cmap(cmap, N=255):
"Copy colormap and set alpha values"
mycmap = cmap
mycmap._init()
mycmap._lut[:,-1] = np.linspace(0, 0.8, N+4)
return mycmap
mycmap = transparent_cmap(plt.cm.coolwarm)
在这种情况下,您之前的代码行将如下更改:
ax[1].imshow(heatmap, alpha=.5, cmap=mycmap, vmin=0, vmax=1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句