Source code for pyiqa.archs.entropy_arch

r"""Entropy Metric for grayscale images.
Entropy is a statistical measure of randomness that can be used to characterize the texture of the input image.

Created by: Chaofeng Chen (https://github.com/chaofengc)

Refer to:
    Matlab: https://www.mathworks.com/help/images/ref/entropy.html

"""

import torch
import torch.nn as nn

from pyiqa.utils.registry import ARCH_REGISTRY
from pyiqa.utils.color_util import to_y_channel


[docs] def entropy(x, data_range=255.0, eps=1e-8, color_space='yiq'): r"""Compute entropy of a gray scale image. Args: x: An input tensor. Shape :math:`(N, C, H, W)`. Returns: Entropy of the image. """ if x.shape[1] == 3: # Convert RGB image to gray scale and use Y-channel x = to_y_channel(x, data_range, color_space) # Compute histogram hist = nn.functional.one_hot(x.long(), num_classes=int(data_range + 1)).sum( dim=[1, 2, 3] ) hist = hist / hist.sum(dim=1, keepdim=True) # Compute entropy score = -torch.sum(hist * torch.log2(hist + eps), dim=1) return score
@ARCH_REGISTRY.register()
[docs] class Entropy(nn.Module): r""" Args: x (torch.Tensor): image tensor with shape (B, _, H, W), range [0, 1] Return: score (torch.Tensor): (B, 1) """ def __init__(self, **kwargs): super().__init__() self.kwargs = kwargs
[docs] def forward(self, x): score = entropy(x, **self.kwargs) return score