目录
图像反色
图像线性点运算
图像对数点运算
图像幂数点运算
图像灰度均衡化
以上函数测试脚本
1.线性,反色,对数,幂数
2.灰度均衡化
结果
图像反色利用的公式为。Matlab本擅长矩阵运算可以直接运算,由于实验要求不能使用矩阵运算,使用循环完成,以下其他点运算也是一样的处理,不再解释。
function OutImage = InverseImageCompute(InputImage)
%================================================================
% 功能:图像灰度发转
% 参数:InputImage为输入单通道图像
% 返回值:OutImage为InputImage同维数组
% 主要思路:直接计算反转后的灰度255-f(m,n)
% 备注:如果图像为多通道则需要重复调用
% 调用方法:OutImage= InverseImageCompute(InputImage)
% 日期:2019.11.27
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
OutImage = zeros(iLimit,jLimit);
for yIndex = 1:iLimit
for xIndex = 1:jLimit
OutImage(yIndex,xIndex) = 255-InputImage(yIndex,xIndex);
end
end
end
function OutImage= LinearImageCompute(InputImage,LineBegin,LineEnd,Minout,MaxOut)
%================================================================
% 功能:图像灰度的线性运算
% 参数:InputImage为输入单通道图像。
% 返回值:OutImage为InputImage同维数组,LineBegin,LineEnd,Minout,MaxOut分别对应a,b,c,d
% 主要思路:构造分段函数
% 备注:如果图像为多通道则需要重复调用
% 使用逻辑函数会更简洁
% 调用方法:LinearImageCompute(InputImage,LineBegin,LineEnd,Minout,MaxOut)
% 日期:2019.11.27
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
OutImage = zeros(iLimit,jLimit);
for yIndex = 1:iLimit
for xIndex = 1:jLimit
if (InputImage(yIndex,xIndex)=0)
OutImage(yIndex,xIndex) = Minout;
elseif (InputImage(yIndex,xIndex)=LineBegin)
OutImage(yIndex,xIndex) = Minout+(MaxOut-Minout)*(InputImage(yIndex,xIndex)-LineBegin)/(LineEnd-LineBegin);
else
OutImage(yIndex,xIndex) = MaxOut;
end
end
end
OutImage = uint8(OutImage);
end
对数运算利用的公式为
其中k为调节常数,用它来调节变换后的灰度值,对数变换的作用是扩展图像的低灰度范围,使其符合实际要求。同时压缩高灰度范围,使得图像灰度分布均匀,与人的视觉特性相匹配。
function OutImage = LogImageCompute(InputImage,AdjConstant)
%================================================================
% 功能:图像灰度的对数运算
% 参数:InputImage为输入单通道图像,AdjConstant为调节常数
% 返回值:OutImage为InputImage同维数组
% 主要思路:每一点进行灰度变换
% 备注:如果图像为多通道则需要重复调用
% 利用矩阵的运算会更简洁
% 调用方法:OutImage= LogImageCompute(InputImage,AdjConstant)
% 日期:2019.11.27
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
OutImage = zeros(iLimit,jLimit);
for yIndex = 1:iLimit
for xIndex = 1:jLimit
OutImage(yIndex,xIndex) = AdjConstant*log10(double(InputImage(yIndex,xIndex)+1));
end
end
OutImage = uint8(OutImage);
end
图像的幂数运算公式为
其中k,a,r为正常数。
function OutImage = PowerImageCompute(InputImage,MulConstant,PowerConstant,PlusConstant)
%================================================================
% 功能:图像灰度的幂数运算
% 参数:InputImage为输入单通道图像,MulConstant,PowerConstant,PlusConstant分别为a,k,r
% 返回值:OutImage为InputImage同维数组
% 主要思路:每一点进行灰度变换
% 备注:如果图像为多通道则需要重复调用
% 利用矩阵的运算会更简洁
% 调用方法:OutImage = PowerImageCompute(InputImage,MulConstant,PowerConstant,PlusConstant)
% 日期:2019.11.27
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
OutImage = zeros(iLimit,jLimit);
for yIndex = 1:iLimit
for xIndex = 1:jLimit
OutImage(yIndex,xIndex) =PlusConstant + MulConstant*(InputImage(yIndex,xIndex)^PowerConstant);
end
end
OutImage = uint8(OutImage);
end
图像的灰度均衡原理比较复杂,感兴趣的可以参考下面的文章。
先留个空,有时间码一篇文章。
function OutImage = BalanceImageCompute(InputImage)
%================================================================
% 功能:直方图均衡化
% 参数:InputImage为输入单通道图像
% 返回值:OutImage为InputImage同维灰度计数数组
% 主要思路:用分布函数做点计算
% 备注:相当于库函数histeq
% 调用方法:[Gray,GrayCount] = GrayCountFun(InputImage)
% 日期:2019.11.26
% 作者:Leetion
[iLimit,jLimit] = size(InputImage);
[Gray,GrayCount] = GrayCountFun(InputImage);%进行像素灰度统计;
PDF = GrayCount./(iLimit*jLimit);
CDF = zeros(1,256);
CDF(1) = PDF(1);
for ii = 2:256
CDF(ii) = CDF(ii-1)+PDF(ii);
end
CDF = 255*CDF;
for iImageIndex = 1:iLimit
for jImageIndex = 1:jLimit
OutImage(iImageIndex,jImageIndex) = CDF((InputImage(iImageIndex,jImageIndex)+1));
end
end
OutImage = uint8(OutImage);
end
%================================================================
% 功能:点计算
% 主要思路:
% 备注:
% 日期:2019.11.27
% 作者:Leetion
clc,clear
close all
InputImage = imread('cameraman.tif');
[LineBegin,LineEnd,Minout,MaxOut] = deal(7,50,7.5,80);
AdjConstant = 100;
[MulConstant,PowerConstant,PlusConstant] = deal(5,1,1.5);
LinearCompute = LinearImageCompute(InputImage,LineBegin,LineEnd,Minout,MaxOut);
LogCompute = LogImageCompute(InputImage,AdjConstant);
PowerCompute= PowerImageCompute(InputImage,MulConstant,PowerConstant,PlusConstant);
InvertCompute = InverseImageCompute(InputImage);
subplot(2,3,1);
imshow(uint8(InputImage));
title("原图");
subplot(2,3,2);
imshow(uint8(LinearCompute));
title("线性运算");
subplot(2,3,3);
imshow(uint8(LogCompute));
title("对数运算");
subplot(2,3,4);
imshow(uint8(PowerCompute));
title("幂数运算");
subplot(2,3,5);
imshow(uint8(InvertCompute));
title("反转运算");
%================================================================
% 功能:直方图均衡化
% 主要思路:
% 备注:
% 日期:2019.11.27
% 作者:Leetion
clc,clear
close all
InputImage = imread('cameraman.tif');
subplot(3,2,1);
imshow(uint8(InputImage));
title("InputImage");
subplot(3,2,2);
[iLimit,jLimit] = size(InputImage);
[counts,x] = imhist(InputImage);
bar(x,counts/(iLimit*jLimit));
subplot(3,2,3);
BalanceCompute = BalanceImageCompute(InputImage);
imshow(BalanceCompute);
title("BalanceCompute");
subplot(3,2,4);
[iLimit,jLimit] = size(BalanceCompute);
[counts,x] = imhist(BalanceCompute);
bar(x,counts/(iLimit*jLimit));
subplot(3,2,5);
imshow(histeq(InputImage,256));
title("histeq");
subplot(3,2,6);
[counts,x] = imhist(histeq(InputImage,256));
bar(x,counts/(iLimit*jLimit));