空间域增强:直方图均衡化
1.几个函数
(1)imhist
imhist( i );直接显示图像i的灰度直方图;
imhist(i,n);n为指定灰度级显示直方图;
[count, x] = imhist( i ) 获取直方图信息,count为每一级灰度像素个数,x为灰度级,x也可以在imhist(i,x)中指定,可以通过stem(x,count)画相应直方图;
(2)histeq
如果图像的对比度太差,常用的方法就是灰度直方图均衡化。在matlab中,能达到这个目的的函数就是histeq,原理如下:
histeq(X,hgram);%X是要打开的图片矩阵,hgram可以指定像素值范围,默认为1:256,改完就成了直方图规定化
[MN]=size(H);
[counts,x]=imhist(H);%H是读取的图像,imhist是对图像直方图进行统计,其中count,是每个灰度值的个数,x代表灰度值。默认x=1:256
location=find(counts~=0);%找到所有像素个数不为0的灰度级
MinCDF=min(counts(location));%找到包含个数最少的灰度级
for j=1:length(location)
CDF=sum(counts(location(1:j)));%计算各个灰度级像素个数累计分布
P=find(H==x(location(j)));%找到图像中等于某个灰度级所有像素点所在位置
H(P)=(CDF-MinCDF)/(M*N-MinCDF);%%利用灰度换算公式,修改所有位置上的像素值
end
简单的说,就是将每个灰度值利用一个变换公式替换掉。
简单的例子:
clc;clear;closeall;
H=imread(‘pout.tif’);figure;subplot(121);imshow(H);%图像应该是灰度图,若图像为彩色图,需要对每个通道进行计算
H=im2double(H);%这个是需要注意的地方,一定要变换成double类型
[MN]=size(H);
[counts,x]=imhist(H);%H是读取的图像,imhist是对图像直方图进行统计,其中count,是每个灰度值得个数,x代表灰度值。一般的,x=1:256
location=find(counts~=0);%找到所有像素个数不为0的灰度级
MinCDF=min(counts(location));%找到包含个数最少的灰度级
for j=1:length(location)
CDF=sum(counts(location(1:j)));%计算各个灰度级像素个数累计分布
P=find(H==x(location(j)));%找到图像中等于某个灰度级所有像素点所在位置
H(P)=(CDF-MinCDF)/(M*N-MinCDF);%%利用灰度换算公式,修改所有位置上的像素值
end
subplot(122);imshow(H)
print(gcf,’-djpeg’,[‘1.jpg’]); % 保存为jpg格式的图片。
2.程序
A=imread(‘F:\我的相册\DIY\pic1.jpg’);
B=rgb2gray(A);
J=histeq(B);
subplot(2,2,1)
imshow(B),title(‘原始图’);
subplot(2,2,2)
imshow(J),title(‘直方图均衡化后的图形’);
subplot(2,2,[3,4])
imhist(B,64),title(‘原始图像的直方图’);%imhist按64个灰度级展开画直方图
subplot(2,2,[3,4])
imhist(J,64),title(‘均衡化后的直方图’);
图像增强的方法(1)
最新推荐文章于 2023-11-03 22:24:43 发布