将两个不同的图像直方图绘制为单个 2D 直方图
Plotting two different image histograms as a single 2D histogram plot
我想在 x 轴上绘制一个 uint16 图像的直方图,在 y 轴上绘制另一个 uint16 图像的直方图,这样我就可以得到它们之间关系的颜色图作为二维图。
我试图形成两个单独的直方图,然后在循环中构造二维数组,但是这是失败的。
first = np.histogram(img1, bins = 1000)
first = first[0]
second = np.histogram(img2, bins = 1000)
second = second[0]
empty_array = np.zeros((1000,1000), dtype = np.float64)
for i in range(1000):
for j in range(1000):
empty_array[i,j] = first[j] + second[1000-j]
如果您正在尝试研究两个变量的直方图以及它们在单个函数中如何相互关联,请考虑阅读多变量正态分布。这肯定适用于研究图像中像素的分布。
https://juanitorduz.github.io/multivariate_normal/
看起来这就是你想要做的?:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns; sns.set(color_codes=True)
sns.set_context("notebook")
sns.set_style("darkgrid")
# %% Construct normal distribution data
n = 100
hist1 = np.random.normal(0,1,n)
hist2 = np.random.normal(0,1,n)
# %% Plot distributions on their own axis
sns.jointplot(x=hist1, y=hist2, kind="kde", space=0)
与 KDE 绘图不同的过程,它实际上找到定义数据的多变量 PDF,然后绘制 PDF。这次 hist2
的分布与 hist1
不同,这使得等高线图上的分布不同:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns; sns.set(color_codes=True)
sns.set_context("notebook")
sns.set_style("darkgrid")
from scipy.stats import multivariate_normal as mvn
# %% Create test data for multivariate PDF
n = 1000
hist1 = np.random.normal(0,1,n)
hist2 = np.random.normal(0,2,n)
# %% Calculate mean and covariance of data
mean = [hist1.mean(), hist2.mean()]
cov_mat = np.cov( np.array([hist1, hist2]) )
# %% Create multivariate function with calculated means and covariance
mv_norm_f = mvn(mean=mean, cov=cov_mat)
# %% Setup ranges of variables for PDF function
range = np.linspace(-1,1,n)
x, y = np.meshgrid(range, range, indexing='xy')
xy = np.empty(x.shape + (2,))
xy[:, :, 0] = x
xy[:, :, 1] = y
print(x.shape)
print(xy.shape)
# %% Call PDF function on ranges of variables
z = mv_norm_f.pdf( xy )
# %% Shaded contour plot the PDF
plt.figure()
plt.contourf(x, y, z)
plt.xlabel("X")
plt.ylabel("Y")
plt.colorbar()
plt.grid('on')
plt.show()
正如@kilozulu 所建议的那样,这是一个使用 seaborn 的解决方案。
我不会使用已经装箱的数据来生成此图,因为您正在丢失两个图像之间数据点的关联。相反,直接输入像素强度:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
#dummy images
img1 = np.random.normal(0,10,(100,100))
img2 = np.random.normal(0,10,(100,100))
# make jointplot with linearised images:
sns.jointplot(img1.ravel(), img2.ravel(), kind='kde')
我想在 x 轴上绘制一个 uint16 图像的直方图,在 y 轴上绘制另一个 uint16 图像的直方图,这样我就可以得到它们之间关系的颜色图作为二维图。
我试图形成两个单独的直方图,然后在循环中构造二维数组,但是这是失败的。
first = np.histogram(img1, bins = 1000)
first = first[0]
second = np.histogram(img2, bins = 1000)
second = second[0]
empty_array = np.zeros((1000,1000), dtype = np.float64)
for i in range(1000):
for j in range(1000):
empty_array[i,j] = first[j] + second[1000-j]
如果您正在尝试研究两个变量的直方图以及它们在单个函数中如何相互关联,请考虑阅读多变量正态分布。这肯定适用于研究图像中像素的分布。 https://juanitorduz.github.io/multivariate_normal/
看起来这就是你想要做的?:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns; sns.set(color_codes=True)
sns.set_context("notebook")
sns.set_style("darkgrid")
# %% Construct normal distribution data
n = 100
hist1 = np.random.normal(0,1,n)
hist2 = np.random.normal(0,1,n)
# %% Plot distributions on their own axis
sns.jointplot(x=hist1, y=hist2, kind="kde", space=0)
与 KDE 绘图不同的过程,它实际上找到定义数据的多变量 PDF,然后绘制 PDF。这次 hist2
的分布与 hist1
不同,这使得等高线图上的分布不同:
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns; sns.set(color_codes=True)
sns.set_context("notebook")
sns.set_style("darkgrid")
from scipy.stats import multivariate_normal as mvn
# %% Create test data for multivariate PDF
n = 1000
hist1 = np.random.normal(0,1,n)
hist2 = np.random.normal(0,2,n)
# %% Calculate mean and covariance of data
mean = [hist1.mean(), hist2.mean()]
cov_mat = np.cov( np.array([hist1, hist2]) )
# %% Create multivariate function with calculated means and covariance
mv_norm_f = mvn(mean=mean, cov=cov_mat)
# %% Setup ranges of variables for PDF function
range = np.linspace(-1,1,n)
x, y = np.meshgrid(range, range, indexing='xy')
xy = np.empty(x.shape + (2,))
xy[:, :, 0] = x
xy[:, :, 1] = y
print(x.shape)
print(xy.shape)
# %% Call PDF function on ranges of variables
z = mv_norm_f.pdf( xy )
# %% Shaded contour plot the PDF
plt.figure()
plt.contourf(x, y, z)
plt.xlabel("X")
plt.ylabel("Y")
plt.colorbar()
plt.grid('on')
plt.show()
正如@kilozulu 所建议的那样,这是一个使用 seaborn 的解决方案。 我不会使用已经装箱的数据来生成此图,因为您正在丢失两个图像之间数据点的关联。相反,直接输入像素强度:
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
#dummy images
img1 = np.random.normal(0,10,(100,100))
img2 = np.random.normal(0,10,(100,100))
# make jointplot with linearised images:
sns.jointplot(img1.ravel(), img2.ravel(), kind='kde')