一:设计方案原理
先采用直方图均衡化的方法进行增强,如果对比度不太好,可以采用分段线性变换或幂函数变换等其他的方法做另一种处理。直方图均衡化是通过对原图像进行某种变换使原图像的灰度直方图修正为均匀的直方图的方法,可以把彩色图像分解为R、G、B三个灰度图像,然后进行直方图均衡化。直方图均衡化这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。分段线性变换和幂变换都可以进行图像增强,但他们需要每个图像都具体的分析,代码不够通用,但是他们的处理后的结果在经过很好的分析后,对比度会比直方图标准化好,视觉效果更好。
二:详细的步骤和过程及结果
2.1图像“timg-1.jpeg”的处理
2.1.1内置函数histeq进行RGB通道处理
先通过imread读出该图片,并使用Out表示它,因为彩色图像都由三个颜色分量R、G、B组成,所以可以通过矩阵操作R=I(:,:,1)、G=I(:,:,2)、B=I(:,:,3)分别读出该彩色图像的红色、绿色、蓝色的分量,然后通过imhist( i )直接显示图像R、G、B分量的灰度直方图;直方图均衡化的实现可以通过统计每个灰度值的个数,然后找出累积分布函数,然后得到累积分布函数最小值最后根据直方图均衡化算式计算均衡化的灰度值然后便可以得到均衡化后的图像。
对于灰度级为离散的数字图像,用频率来替代概率。在MATLAB中实现较简单,有内置函数histeq来直接进行直方图均衡化。该图形原图如图1所示,均衡化后的彩色图像如图2所示,变换前和均衡化后的直方图在图3中展示。
2.1.2内置函数histeq进行HSV通道处理
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。对于夜晚图像的增强,可以只对亮度通道进行增强。对于图形1,通过该方法处理后得到的图像如图1所示。函数HSV = rgb2hsv(RGB)可直接转换为HSV图像。利用该方法得到的图像如图4所示。
图 1图一的原图 图 2直方图均衡化RGB图像
图 3图一的RGB直方图对比 图 4图一的HSV通道均衡化图像
三:程序的流程图
3.1直方图均衡化流程
图 41直方图HSV通道均衡化 图 42直方图RGB通道标准化
四:程序的代码
4.1直方图RGB通道均衡化代码(使用内置函数histeq)
clc
close all
clear
I=imread('E:\图像分析与处理技术作业2\卡通暗.jpg');
Out=I;
%变化前灰度值直方图
R=I(:,:,1);subplot(2,3,1),imhist(R);title('R')
G=I(:,:,2);subplot(2,3,2),imhist(G);title('G')
B=I(:,:,3);subplot(2,3,3),imhist(B);title('B')
%变化后灰度值直方图
R=histeq(R);subplot(2,3,4),imhist(R);title('均衡后 R')
G=histeq(G);subplot(2,3,5),imhist(G);title('均衡后 G')
B=histeq(B);subplot(2,3,6),imhist(B);title('均衡后 B')
Out(:,:,1)=R;
Out(:,:,2)=G; %合成为1个图像
Out(:,:,3)=B;
figure,
imshow(I);
title('原图像')
figure,
imshow(Out);
title('直方图均衡化后的图像')
4.1直方图HSV通道均衡化代码(使用自己设计的均衡化函数)
clc
close all
clear
I=imread('E:\图像分析与处理技术作业2\timg-1.jpeg');
%将图像变为HSV图像
OutImg=rgb2hsv(I);
V=OutImg(:,:,3);
V = floor(V * 255);
%对V进行均衡化
V=hist_1(V);
V = V / 255;
%变化后图像
OutImg(:,:,3) = V;
OutImg = hsv2rgb(OutImg);
imshow(I);
title('原图像')
figure,
imshow(OutImg);
title('直方图HSV通道均衡化后的图像')
%直方图均衡化函数
function hist_img = hist_1(I)
[M, N] = size(I);
size_img = M*N;
c = zeros(1,256);%统计每个每个像素值的个数
b= c;%转化前后的对照表
temp = I(:);
temp = sort(temp);
for i = 1:size_img
c(temp(i)+1) = c(temp(i)+1)+1;
end
a = c;%求和
for i = 2:256
a(i) = c(i) + a(i-1);
end
min_cdf = 10000;
for i = 1:256
if a(i)>0
if a(i) < min_cdf
min_cdf = a(i);
end
end
end
for j = 1:256
if a(j) > 0
b(j) = round(255*(a(j)-min_cdf)/(size_img-min_cdf));
end
end
for i = 1:M
for j = 1:N
I(i,j) = b(I(i,j)+1);
end
end
hist_img = I;
end