Как рассчитать взаимную информацию 2d изображений в python - PullRequest
0 голосов
/ 18 марта 2020

Изображения хранятся в images_values

, таких как 276 изображений со столбцами x строк

images_values.shape = (276, 1080, 1920)

Как правильно передать его следующей функции для вычисления взаимной информации между два изображения? т.е. images_values[0,:,:] и images_values[1,:,:]?

from scipy import ndimage

EPS = np.finfo(float).eps

 def mutual_information_2d(x, y, sigma=1, normalized=False):
    """
    Computes (normalized) mutual information between two 1D variate from a
    joint histogram.
    Parameters
    ----------
    x : 1D array
        first variable
    y : 1D array
        second variable
    sigma: float
        sigma for Gaussian smoothing of the joint histogram
    Returns
    -------
    nmi: float
        the computed similariy measure
    """
    bins = (256, 256)



    jh = np.histogram2d(x, y, bins=bins)[0]

    # smooth the jh with a gaussian filter of given sigma
    ndimage.gaussian_filter(jh, sigma=sigma, mode='constant',
                                 output=jh)

    # compute marginal histograms
    jh = jh + EPS
    sh = np.sum(jh)
    jh = jh / sh
    s1 = np.sum(jh, axis=0).reshape((-1, jh.shape[0]))
    s2 = np.sum(jh, axis=1).reshape((jh.shape[1], -1))

    # Normalised Mutual Information of:
    # Studholme,  jhill & jhawkes (1998).
    # "A normalized entropy measure of 3-D medical image alignment".
    # in Proc. Medical Imaging 1998, vol. 3338, San Diego, CA, pp. 132-143.
    if normalized:
        mi = ((np.sum(s1 * np.log(s1)) + np.sum(s2 * np.log(s2)))
                / np.sum(jh * np.log(jh))) - 1
    else:
        mi = ( np.sum(jh * np.log(jh)) - np.sum(s1 * np.log(s1))
               - np.sum(s2 * np.log(s2)))

    return mi

1 Ответ

1 голос
/ 18 марта 2020

Вы можете просто передать это как

mi=mutual_information_2d(images_values[0,:,:].ravel(), images_values[1,:,:].ravel())

ravel изменит массив 2d в 1d, как ожидается функцией mutual_information_2d.

Правильно ли я понял ваш вопрос?

...