数字图像处理-Matlab实现图像点运算

目录

图像反色

图像线性点运算

图像对数点运算

图像幂数点运算

图像灰度均衡化

以上函数测试脚本

1.线性,反色,对数,幂数

2.灰度均衡化

结果


图像反色

图像反色利用的公式为% MathType!MTEF!2!1!+- % feaahqart1ev3aaatCvAUfeBSjuyZL2yd9gzLbvyNv2CaerbuLwBLn % hiov2DGi1BTfMBaeXatLxBI9gBaerbd9wDYLwzYfdmGievaebbnrfi % fHhDYfgatCvAUfeBSn0BKvguHDwzZbqegSSZmxoasaacH8srps0lbb % f9q8WrFfeuY-Hhbbf9v8qqaqFr0xc9pk0xbba9q8WqFfea0-yr0RYx % ir-Jbba9q8aq0-yq-He9q8qqQ8frFve9Fve9Ff0dmeaabaqaciGaca % GaaeqabaWaaeaaeaqbaOqaaiaad+eadaqadaqaaiaad2gacaGGSaGa % amOBaaGaayjkaiaawMcaaiabg2da9iaaikdacaaI1aGaaGynaiabgk % HiTiaadMeadaqadaqaaiaad2gacaGGSaGaamOBaaGaayjkaiaawMca % aaaa!4CF6! \[O\left( {m,n} \right) = 255 - I\left( {m,n} \right)\]\[O\left( {m,n} \right) = 255 - I\left( {m,n} \right)\]。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

图像对数点运算

对数运算利用的公式为\[O\left( {m,n} \right) = k \cdot \log \left( {1 + I\left( {m,n} \right)} \right)\]

其中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

图像幂数点运算

图像的幂数运算公式为\[O\left( {m,n} \right) = k \cdot I{\left( {m,n} \right)^r}{\rm{ + }}a\]

其中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

以上函数测试脚本

1.线性,反色,对数,幂数

%================================================================
% 功能:点计算
% 主要思路:
% 备注:
% 日期: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("反转运算");

2.灰度均衡化

%================================================================
% 功能:直方图均衡化
% 主要思路:
% 备注:
% 日期: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));





结果

数字图像处理-Matlab实现图像点运算_第1张图片 点运算

 

数字图像处理-Matlab实现图像点运算_第2张图片 直方图均衡化

 

你可能感兴趣的:(数字图像处理,数字图像处理,Matlab,点运算,直方图均衡化,线性运算)