简体   繁体   English

将两个不同的图像直方图绘制为单个 2D 直方图

[英]Plotting two different image histograms as a single 2D histogram plot

I'm looking to plot the histogram of one uint16 image on the x axis and the histogram of another uint16 image on the y axis, such that I get a colormap of the relationship between them as a 2D plot.我希望在 x 轴上绘制一个 uint16 图像的直方图,在 y 轴上绘制另一个 uint16 图像的直方图,以便我获得它们之间关系的颜色图作为 2D 图。

这是我追求的那种情节

I have tried to form two seperate histograms and then construct the 2D array in a loop however this is failing.我试图形成两个单独的直方图,然后在循环中构建二维数组,但是这是失败的。

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]

If you're trying to study the histogram of two variables and how they relate to each other in a single function, consider reading about multi-variate normal distributions.如果您正在尝试研究两个变量的直方图以及它们在单个函数中的相互关系,请考虑阅读多变量正态分布。 This would apply to studying distributions of pixels in a image for sure.这肯定适用于研究图像中像素的分布。 https://juanitorduz.github.io/multivariate_normal/ https://juanitorduz.github.io/multivariate_normal/

It looks like this is what you were trying to do?:看起来这就是你想要做的?:

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 图

A different process than the KDE plot that actually finds the multi-variate PDF that defines your data then plots the PDF.与 KDE 图不同的过程,它实际找到定义数据的多变量 PDF,然后绘制 PDF。 This time hist2 has a different distribution than hist1 which makes the spread on the contour plot different:这一次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()

多变量 PDF 的阴影等高线图

This is a solution using seaborn, as already suggested by @kilozulu.这是使用 seaborn 的解决方案,正如@kilozulu 已经建议的那样。 I would not use data that is already binned to generate this plot, because you are losing the association of data points between the two images.我不会使用已经分箱的数据来生成这个图,因为你会失去两个图像之间数据点的关联。 Rather, feed in the pixel intentities directly:相反,直接输入像素意图:

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')

在此处输入图片说明

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM