您的位置:首页 > 其它

图像增强--图像对比度、线性展宽、灰级窗、线性动态范围调整、直方图均衡化

2016-11-30 17:47 477 查看
图像对比度:

%% 计算图像对比度——4近邻
%  @matrix -- 输入的图像为灰度图
% 处理方式:构造一个一维差数[1,max+1],组沿着矩阵row轴,当前像素值与右一个像素做差取绝对值
%                 将其累加1在一维差数组对应位置上,到row-1。沿col轴同理。
%                 对一维数组除以总共差个数,得到灰度差分布概率数组,再用公式求解:∑(m^2*temp[m])

%该方法是对一张图像对比度的求解
function C=m_contrast4(matrix)
[row,col] = size(matrix);
num = max(max(matrix));%矩阵中最大值
temp = zeros(1,double(num)+1);   %一维像素间的灰度差数组

for i = 1:row   %沿col
for j = 1:col-1
num_y = abs(matrix(i,j)-matrix(i,j+1));
temp(1,num_y+1)  = temp(1,num_y+1)+1;
end
end

for i = 1:row-1   %沿row
for j = 1:col
num_x = abs(matrix(i,j)-matrix(i+1,j));
temp(1,num_x+1)  = temp(1,num_x+1)+1;
end
end
temp_cop = temp/sum(temp);  %灰度差分布概率数组
C=0;
for m = 1:num
C = C +  (m^2)*temp_cop(1,m+1);
end


%% 计算图像对比度——8近邻
%  @matrix -- 输入的图像为灰度图
%处理方式:中心像素灰度值与周围8近邻像素灰度值之差的平方之和,除以以上之差的个数。

%{
%介绍函数 padarray
功能:填充图像或填充数组。
用法:B = padarray(A,padsize,padval,direction)    A为输入图像,B为填充后的图像

padsize->给出了给出了填充的行数和列数,通常用[r c]来表示。

padval->表示填充方法。它的具体值和描述如下:
             'symmetric'表示图像大小通过围绕边界进行镜像反射来扩展;
'replicate'表示图像大小通过复制外边界中的值来扩展;
'circular'图像大小通过将图像看成是一个二维周期函数的一个周期来进行扩展。

direction->表示填充的方向。它的具体值和描述如下:
'pre'表示在每一维的第一个元素前填充;
'post'表示在每一维的最后一个元素后填充;
'both'表示在每一维的第一个元素前和最后一个元素后填充,此项为默认值。

若参量中不包括direction,则默认值为'both'。
若参量中不包含padval,则默认用零来填充。
若参量中不包括任何参数,则默认填充为零且方向为'both'。在计算结束时,图像会被修剪成原始大小。
%}

function C = m_contrast8(matrix)  %matrix为输入图像
[row, col] = size(matrix);  %求原始图像的行数和列数
%对原始图像进行扩展,比如50*50的图像,扩展后变成52*52的图像
matrix_cop = padarray(matrix,[1 1],'symmetric','both');
%扩展只是对原始图像的周边像素进行复制的方法进行
[row_cop,col_cop] = size(matrix_cop);%求扩展后图像的行数r和列数
%C = double(matrix_cop);  %把扩展后图像转变成双精度浮点数
k=0;  %定义一数值k,初始值为0
for i=2:row_cop-1
for j=2:col_cop-1
k = k+(matrix_cop(i-1,j-1)-matrix_cop(i,j))^2+(matrix_cop(i-1,j)-matrix_cop(i,j))^2+(matrix_cop(i-1,j+1)-matrix_cop(i,j))^2+...
(matrix_cop(i,j+1)-matrix_cop(i,j))^2+(matrix_cop(i+1,j+1)-matrix_cop(i,j))^2+(matrix_cop(i+1,j)-matrix_cop(i,j))^2+...
(matrix_cop(i+1,j-1)-matrix_cop(i,j))^2+(matrix_cop(i,j-1)-matrix_cop(i,j))^2;
end
end
C =double( k/(8*(row-2)*(col-2)+6*(2*(row-2)+2*(col-2))+4*3));%求原始图像对比度


%% 对比度线性展宽

%图像关注区域的像素范围[fa,fb]由beld扩展到[ga,gb],

% [0,fa]由alf控制

% [fb,255]由gamma

% alf<1,gamma<1,beld>1

% fb-fa

%% 灰级窗
%  @matrix -- 输入的图像为灰度图
% 原理:只对[fa,fb]映射到[0,255]
function G = m_GrayWindow(matrix,fa,fb)
[row,col] = size(matrix);
beld = 255/(fb-fa);%对图像素
G = zeros(row,col);
%G = matrix;
for i=1:row
for j=1:col
if (matrix(i,j)>=fa) && (matrix(i,j)<fb)
G(i,j) = beld*(matrix(i,j)-fa);
end
end
end


%% 灰级窗切片
%  @matrix -- 输入的图像为灰度图
%  原理:像素在[fa,fb]范围值赋为255
function G = m_GrayWindowSection(matrix,fa,fb)
[row,col] = size(matrix);
G =zeros(row,col);
for i =1:row
for j=1:col
if (matrix(i,j)>=fa && matrix(i,j)<fb)
G(i,j) = 255;  %对图像处理
end
end
end


%% 线性动态范围调整
% 图像中 像素在[fa,fb]范围映射到[0,255],小于fa的赋0,大于fbd的赋255
function G = m_LinearAdjust(matrix,fa,fb)
[row,col] = size(matrix);
beld = 255/(fb-fa);%对图像素处理
G = zeros(row,col);
%G = matrix;
for i=1:row
for j=1:col
if (matrix(i,j)>=fa) && (matrix(i,j)<fb)
G(i,j) = round(beld*(matrix(i,j)-fa));
end
if matrix(i,j)>=fb
G(i,j) = 255;
end
end
end


%% 线性动态范围调整
%  @matrix -- 输入的图像为灰度图
% 图像中对像素用对数运算进行平滑处理:
function G = m_ULinearAdjust(matrix)
[row,col] = size(matrix);
%matrix = im2double(matrix);
c = 255/log(255+1);%对图像素处理
G = zeros(row,col);
%G = matrix;
for i=1:row
for j=1:col
G(i,j) = round(c*log(1+double(matrix(i,j))));
end
end


%% 直方图均衡化
%   @image-输入的图像为灰度图
%   1.求image的灰度直方图向量H
%   2.由H/row*col  得到灰度分布概率Pi,及计算累计分布概率Pa
%   3.求得255*Pa后,从原图image像素映射到Gi像素
%   @Gi-输出处理后图像
function Gi = m_HistogramEqualiza(image)
[row,col] = size(image);
num = max(max(image));  %矩阵中最大值
H = zeros(1,double(num)+1);  %灰度直方图向量
PI = zeros(1,double(num)+1);  %灰度分布概率
Pa = zeros(1,double(num)+1);  %累计分布概率
Gi = zeros(row,col);
format rat  %分数形式
for i=1:row
for j=1:col
H(double(image(i,j))+1)  = H(double(image(i,j))+1)+1;
end
end
PI = H/(row*col);

Pai = 0;
for m=2:double(num)+1
Pai = Pai+PI(m);
Pa(m) = Pai+PI(1);
end
Pa = round(double(num)*Pa);

for i=1:row
for j=1:col
Gi(i,j) = Pa(image(i,j)+1);
end
end

imhist(image);title('输入图像的灰度直方图');
figure;
imhist(uint8(Gi));
title('直方图均衡化后图像的灰度直方图');
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: