【matlab编程实战】图片二维熵计算
欢迎关注,高强度更新和MATLAB,PYTHON编程,C++编程,算法编程,深度学习,自然语言处理,图像处理,OPENCV等相关知识:)
首先,输入一张lena的图片:
然后编写下面的代码:
clear all; clc;
%%读取输入图像
im_T = imread('lena_color.png');
im_T = imresize(im_T,[256 256]);%缩小了下图片,不然速度太慢了
imshow(im_T);
%%输入图像RGB转转化为三通道图像
image = im_T;
ycbcr = rgb2ycbcr(image); %Y'为颜色的亮度(luma)成分、而CB和CR则为蓝色和红色的浓度偏移量成份。Y'和Y是不同的,而Y就是所谓的流明(luminance),表示光的浓度且为非线性,使用伽马修正(gamma correction)编码处理。
y = ycbcr(:, :, 1);
cb = ycbcr(:, :, 2);
cr = ycbcr(:, :, 3);
%初始化
cnt = 0; %记录区域块位置
sumend = 0; %二维信息熵的值
maxcount=0; %最高频次
center = 0; %区域块的中心点
average = 0; %邻域灰度均值
patch_size =5; %确定区域块大小
[h, w] = size(y);
gridx = 1:1 : w-patch_size+1;
gridy = 1:1 : h-patch_size+1;
centerpoint = (patch_size^2+1)*0.5; %区域块中心点位置
HP = zeros(patch_size-2, (w-4)*(h-4)); %保存中心灰度值 邻域灰度均值 概率 频次
LP = zeros(patch_size-4, (w-4)*(h-4));
%获取每个区域块的中心灰度值、领域灰度均值
for ii = 1:1:length(gridx)
for jj = 1:1:length(gridy)
cnt = cnt+1;
yy = gridx(ii);
xx = gridy(jj);
mPatch = y(yy:yy+patch_size-1, xx:xx+patch_size-1);
mPatch = mPatch(:);
center = mPatch(centerpoint);
mPatch(centerpoint) = 0;
average = sum(mPatch)/(patch_size^2-1);
HP(:,cnt) = [center,average,0];
end
end
%获取每个区域块、频次
for ii = 1:1:cnt
first = HP(1,ii) ;
second = HP(2,ii);
ind = find((HP(1,:) == first) );
idx = find((HP(2,ind) == second));
t = length(idx);
HP(3,ii) = t;
end
%获取最高频次 并创建MP
[B , IX] = sort(HP(3,:),'descend');
maxcount=B(1);
MP = zeros(patch_size-4, maxcount);
for ii = 1:1:maxcount
ii
ind = find((HP(3,:) == ii) );
MP(1,ii) = length(ind);
end
%计算二维信息熵
for ii = 1:1:maxcount;
ii
PI = ii/(255*255);
sumend = MP(1,ii)*(PI)*log2(PI) + sumend;
end
sumend = -sumend;
fprintf('图片的二维信息熵是 %f dB\n', sumend);