目录
寻找最大值和索引
function [MaxValue,iMaxValueIndex,jMaxValueIndex] = MaxValueFun(InputImage)
%================================================================
% 功能:计算最大值和索引
% 参数:InputImage为输入单通道图像
% 返回值:MaxValue为最大值,iMaxValueIndex,jMaxValueIndex为最大值索引,如果有多个则返回多个
% 主要思路:利用循环
% 备注:使用Max函数将会提高运算
% 调用方法:[MaxValue,iMaxValueIndex,jMaxValueIndex] = MaxValueFun(InputImage)
% 日期:2019.11.26
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
MaxValue = 0;
iMaxValueIndex = [iLimit];
jMaxValueIndex = [jLimit];
NumMaxValue = 1;
for iImageIndex = 1:iLimit
for jImageIndex = 1:jLimit
if (InputImage(iImageIndex,jImageIndex) > MaxValue)
MaxValue = InputImage(iImageIndex,jImageIndex);
iMaxValueIndex = [iImageIndex];
jMaxValueIndex = [jImageIndex];
NumMaxValue = 1;
elseif(InputImage(iImageIndex,jImageIndex) == MaxValue)
NumMaxValue = NumMaxValue+1;
iMaxValueIndex(NumMaxValue) = iImageIndex;
jMaxValueIndex(NumMaxValue) = jImageIndex;
end
end
end
end
寻找最小值和索引
function [MinValue,iMinValueIndex,jMinValueIndex] = MinValueFun(InputImage)
%================================================================
% 功能:计算最小值和索引
% 参数:InputImage为输入单通道图像
% 返回值:MinValue为最大值,iMinValueIndex,jMinValueIndex为最大值索引,如果有多个则返回多个
% 主要思路:利用循环
% 备注:使用Min函数将会提高运算
% 调用方法:[MinValue,iMinValueIndex,jMinValueIndex] = MinValueFun(InputImage)
% 日期:2019.11.26
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
MinValue = 1e6;
iMinValueIndex = [];
jMinValueIndex = [];
NumMinValue = 1;
for iImageIndex = 1:iLimit
for jImageIndex = 1:jLimit
if(InputImage(iImageIndex,jImageIndex) < MinValue)
MinValue = InputImage(iImageIndex,jImageIndex);
iMinValueIndex = [iImageIndex];
jMinValueIndex = [jImageIndex];
NumMinValue = 1;
elseif(InputImage(iImageIndex,jImageIndex) == MinValue)
NumMinValue = NumMinValue+1;
iMinValueIndex(NumMinValue) = iImageIndex;
jMinValueIndex(NumMinValue) = jImageIndex;
end
end
end
end
计算平均值
function MeanValue= MeanValueFun(InputImage)
%================================================================
% 功能:计算均值
% 参数:InputImage为输入单通道图像
% 返回值:MeanValue为均值
% 主要思路:利用循环
% 备注:使用Mean函数将会提高运算
% 调用方法:MeanValue= MeanValueFun(InputImage)
% 日期:2019.11.26
% 作者:Leetion
SumValue = 0;
MeanValue = 0;
[iLimit,jLimit] = size(InputImage);
for iImageIndex = 1:iLimit
for jImageIndex = 1:jLimit
SumValue = SumValue+InputImage(iImageIndex,jImageIndex);
end
end
MeanValue = SumValue/(iLimit*jLimit);
end
计算方差
function VarValue = VarValueFun(InputImage)
%================================================================
% 功能:计算方差
% 参数:InputImage为输入单通道图像
% 返回值:VarValue为方差
% 主要思路:利用循环
% 备注:使用Var函数将会提高运算
% 调用方法:VarValue = VarValueFun(InputImage)
% 日期:2019.11.26
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
[SumValue,MeanValue,VarValue] = deal(0,0,0);
[iLimit,jLimit] = size(InputImage);
for iImageIndex = 1:iLimit
for jImageIndex = 1:jLimit
SumValue = SumValue+InputImage(iImageIndex,jImageIndex);
end
end
MeanValue = SumValue/(iLimit*jLimit);
for iImageIndex = 1:iLimit
for jImageIndex = 1:jLimit
VarValue = VarValue+(InputImage(iImageIndex,jImageIndex)-MeanValue)^2;
end
end
VarValue = VarValue/(iLimit*jLimit);
end
计算灰阶频数
function [Gray,GrayCount] = GrayCountFun(InputImage)
%================================================================
% 功能:灰度值计数
% 参数:InputImage为输入单通道图像
% 返回值:GrayCount为Gray同维灰度计数数组
% 主要思路:利用循环
% 备注:相当于库函数imhist
% 调用方法:[Gray,GrayCount] = GrayCountFun(InputImage)
% 日期:2019.11.26
% 作者:Leetion
InputImage = InputImage+1;%%防止找不到索引
[iLimit,jLimit] = size(InputImage);
% MaxValue = max(max(InputImage));
% MinValue = min(min(InputImage));
% Gray = [MinValue:MaxValue];
% GrayCount = zeros(1,MaxValue+1-MinValue);
Gray = [0:255];
GrayCount = zeros(1,256);
for iImageIndex = 1:iLimit
for jImageIndex = 1:jLimit
GrayCount(InputImage(iImageIndex,jImageIndex)) = GrayCount(InputImage(iImageIndex,jImageIndex))+1;
end
end
end
以上函数的测试脚本
%================================================================
% 功能:求特征值,绘制直方图
% 主要思路:
% 备注:
% 日期:2019.11.26
% 作者:Leetion
clc,clear
close all
ImagePath ='E:\17.MatlabWorks\03.数字图像处理\00.Matlab内置图片库\';
FileName ='moon.tif';
FileType = FileName(end-2:end);
FullFile =[ImagePath FileName];
if(FileType ~= "bmp")
InputImage = imread(FullFile,FileType);
else
[InputImageIndex,ColorMap] = imread(FullFile,FileType);
InputImage = ind2rgb(InputImageIndex,ColorMap);
end
if size(InputImage,3) == 3
InputImageGray = double(rgb2gray(imgInputImage));
else
InputImageGray = double(InputImage);
end
[iLimit,jLimit] = size(InputImageGray);
% VectorInputImageGray = InputImageGray(:);
[MaxValue,iMaxValueIndex,jMaxValueIndex] = MaxValueFun(InputImageGray);
[MinValue,iMinValueIndex,jMinValueIndex] = MinValueFun(InputImageGray);
[Gray,GrayCount] = GrayCountFun(InputImageGray);
figure(2);
GrayValueNumber = zeros(MaxValue-MinValue+1,1);
subplot(1,3,1);
imshow(InputImage);
title('InputImage');
subplot(1,3,2);
[counts,x] = imhist(uint8(InputImageGray));
bar(x,counts/(iLimit*jLimit));
title("直方图库函数");
subplot(1,3,3);
bar(Gray,GrayCount/(iLimit*jLimit));
title("自己编写的直方图函数");
MeanValue = MeanValueFun(InputImageGray)
VarValue = VarValueFun(InputImageGray)
figure(1);
imshow(InputImage);
hold on;
title('InputImage');
plot(jMaxValueIndex,iMaxValueIndex,'*');
plot(jMinValueIndex,iMinValueIndex,'o');
legend("极大值点","极小值点");
text = sprintf('图像极大值为 %d, 极小值为 %d', MaxValue,MinValue);
title(text);
测试脚本结果
注:
1.转载请注明出处。
2.并非作者不愿意使用库函数。