如何计算两个方向(水平和垂直)的图片熵?

How can I calculate Entropy of picture in two directions(Horizental and vertical)?

我需要计算图片在两个方向(水平和垂直)的熵? 我如何在 matlab 上实现它?

待编辑:一些可能有用的信息。

使用 GLCM(Gray-Level Co-Occurrence 矩阵)查找图像的水平和垂直能量

基于与纹理分析相关的评论中发布的文档。要找到图像的水平和垂直能量,可以从 GLCM(Gray-Level Co-Occurrence 矩阵)中提取统计数据,在本例中特别是 Energy 属性。最近的方向 neighbour/values 来检查之间的关系。我会建议更多地 in-depth 了解这些函数的所有属性,因为我对它们的使用有限 knowledge/experience。

direction/offset 是一个向量,定义为: [Vertical_Direction Horizontal_Direction]

有用的相关 MATLAB 文档:

MATLAB Documentation: Create gray-level co-occurrence matrix from image

MATLAB Documentation: Texture Analysis Using the Gray-Level Co-Occurrence Matrix (GLCM)

脚本:

%Creating the sample image and plotting%
Sample_Image = imread("Greyscale_Image.png");

%Calculating the Gray-Level Co-Occurence Matrices%
Horizontal_Offset = [0 1];
Vertical_Offset = [1 0];

Horizontal_GLCM = graycomatrix(Sample_Image, 'offset', Horizontal_Offset, 'Symmetric', true);
Vertical_GLCM = graycomatrix(Sample_Image, 'offset', Vertical_Offset, 'Symmetric', true);

Horizontal_Statistics = graycoprops(Horizontal_GLCM);
Horizontal_Statistics.Energy

Vertical_Statistics = graycoprops(Vertical_GLCM);
Vertical_Statistics.Energy

有趣的是 Horizontal_GLCMVertical_GLCM 的熵是相等的

entropy(Horizontal_GLCM)
entropy(Vertical_GLCM)


寻找图像的熵(Grayscale/Greyscale)

前言:

图像和字符串的熵通常按以下形式定义:

其中,pi 是给定像素强度的熵概率 IH(s) 是 signal/image 的熵。概率是intensity/number个像素出现的频率。这方面的一个例子可能包括:

像素数 = 8

像素强度:20 → 频率 = 1 → 概率 = 1/8 → 熵项 = -(1/8)×log2( 1/8)
像素强度:80 → 频率 = 3 → 概率 = 3/8 → 熵项 = -(3/8)×log2(3/8 )
像素强度:120 → 频率 = 3 → 概率 = 3/8 → 熵项 = -(3/8)×log2(3/8 )
像素强度:160 → 频率 = 1 → 概率 = 1/8 → 熵项 = -(1/8)×log2(1/8 )

图像的熵:

H(s) = [-(1/8)×log2(1/8)] + [-(3/8)×log2(3/8)] + [-(3/8)×log2(3/8)] + [-(1/8)×log2(1/8)]

H(s) ≈ 1.811278(根据源编码对图像进行编码需要2位)

脚本:

方法一:使用entropy()函数

entropy() 函数 returns 图像的熵,并设置图像编码所需位数的下限。更具体地说 Number_Of_Bits_Required = ceil(entropy(image)).

%Creating the sample image and plotting%
Sample_Image = uint8([20 80 80 80; 120 120 120 160]);
imshow(Sample_Image,'InitialMagnification',1500);
title("Test Image");
set(gcf, 'Position',  [100, 100, 500, 400]);
axis on
xlabel('X-Axis'); ylabel('Y-Axis');

Image_Entropy = entropy(Sample_Image);

方法 2:使用循环计算

使用循环遍历所有独特的像素强度。通过使用条件设置的逻辑矩阵并计算该矩阵的总和来计算出现次数。然后通过将出现次数除以像素数来找到概率。然后将概率的 log2() 添加到变量 Calculated_Entropy 中,这将 accumulate/add 增加与每个特定概率对应的所有熵项。

%Creating the sample image and plotting%
Sample_Image = uint8([20 80 80 80; 120 120 120 160]);
imshow(Sample_Image,'InitialMagnification',1500);
title("Test Image");
set(gcf, 'Position',  [100, 100, 500, 400]);
axis on
xlabel('X-Axis'); ylabel('Y-Axis');

%Finding the image dimensions%
[Image_Height,Image_Width] = size(Sample_Image);
Number_Of_Pixels = Image_Height*Image_Width;

%Evaluating the unique intensity values%
Unique_Intensities = unique(Sample_Image);

%Initializing variables for later use%
Number_Of_Unique_Intensities = length(Unique_Intensities);
Probabilities = zeros(Number_Of_Unique_Intensities,1);
Calculated_Entropy = 0;

%Scanning through the unique intensities and evaluating the probabilities%
for Intensity_Index = 1: Number_Of_Unique_Intensities

    %Grabbing a unique intensity value%
    Intensity_Value = Unique_Intensities(Intensity_Index,1);  
    
        %Evaluating the frequency of the unique intensity value%
        Check_Array = (Sample_Image == Intensity_Value);
        Probabilities(Intensity_Index,1) = sum(Check_Array,'all')/Number_Of_Pixels;
        Calculated_Entropy = -Probabilities(Intensity_Index,1)*log2(Probabilities(Intensity_Index,1))+Calculated_Entropy;
        
end

Image_Entropy = entropy(Sample_Image);

fprintf("Calculated entropy: %f\n",Calculated_Entropy);
fprintf("Using the entropy function: %f\n",Image_Entropy);

运行 使用 MATLAB R2019b