如何计算两个方向(水平和垂直)的图片熵?
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_GLCM
和 Vertical_GLCM
的熵是相等的
entropy(Horizontal_GLCM)
entropy(Vertical_GLCM)
寻找图像的熵(Grayscale/Greyscale)
前言:
图像和字符串的熵通常按以下形式定义:
其中,pi
是给定像素强度的熵概率 I
,H(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
我需要计算图片在两个方向(水平和垂直)的熵? 我如何在 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_GLCM
和 Vertical_GLCM
的熵是相等的
entropy(Horizontal_GLCM)
entropy(Vertical_GLCM)
寻找图像的熵(Grayscale/Greyscale)
前言:
图像和字符串的熵通常按以下形式定义:
其中,pi
是给定像素强度的熵概率 I
,H(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