这是在matlab实时脚本中的代码实现啦!过程下面讲的比较清楚,如果有错误欢迎指出!
```Matlab
% 获得输入
figure_input = [[1,3,9,9,8];[2,1,3,7,3];[3,6,0,6,4];[6,8,2,0,5];[2,9,2,6,0]];
% disp(figure_input(1,:)) disp是输出到命令窗口语句,列表索引从1开始,记得:表示全部,否则默认返回一个
% 获得输入的行数和列数,并存储于变量M和N中
[M,N] = size(figure_input);
% 对输入进行reshape
flattened_data = reshape(figure_input,1,M*N);
% 对输入进行归一化操作,mat2gray即对图像矩阵归一化函数,0,255表示灰度级的变化范围,最后获得的矩阵数值在0到1之间
normalized_figure_input = reshape(mat2gray(figure_input,[0,255]),1,M*N);
reshape(normalized_figure_input,M,N)% 获得归一化后的矩阵
% count是每一个灰度级出现次数
% X是柱状图中心的横坐标
% hist函数是用于画统计图的,类似sns的countplot
[count,X] = hist(normalized_figure_input);
% 计算每一个灰度级的出现概率
count = count/sum(count);
% 做一个不调包的人!自己实现hesteq
% 很简单就是把之前的概率进行累加,然后去找这个概率距离哪一个灰度级近,把近的赋值给他即可
% 概率累积分布,后面的累加前面的,如果这是一条连续曲线,求导即为概率密度函数,即反映概率变化快慢
for index = 2:length(count)
count(index) = count(index)+count(index-1);
end
% count 可以观测一下count的输出
level_var = 0;
for index = 1:length(count)
min_error = 1;
% 无需从头遍历,因为后面的概率一定比前面大,所以在比较时从前一个点赋值的数继续比较即可
for level = level_var:9 % 10是所有的灰度级,当然这里可以把它封装成一个函数,或者用length(unique(input))也能获得长度
% 计算绝对值的误差,如果小于最小的误差,则赋值,灰度级加1
if abs(count(index)-(level_var/9))<min_error
min_error = abs(count(index)-(level_var/9));
level_var = level_var+1;
else
% 上一个判断默认加1,因此此处需要回退一步
level_var = level_var-1;
count(index) = level_var/9;
break
end
end
end
% disp(count) 输出看看结果
for i = 1:length(flattened_data)
% 对应数值进行变换
flattened_data(i) = count(flattened_data(i)+1);
end
% 作图
subplot(1,3,1)
imshow(mat2gray(figure_input,[0,255]))
title('均衡化前')
subplot(1,3,2)
imshow(result)
title('均衡化后(自写)')
subplot(1,3,3)
histeq(reshape(normalized_figure_input,M,N))
title('均衡化后(调包)')
% 对比一下结果,感觉还可以,有空可以看看源码,他应该是加了一些噪声或者是其他的,总之大差不差
result = reshape(flattened_data,M,N)
J = histeq(reshape(normalized_figure_input,M,N))
% 均值滤波(先调包了,因为实现起来比较容易,就是附近的均值,后续有空再写)
average_filtered_figure = imfilter(figure_input,fspecial('average',[3,3]))