MATLAB直方图匹配
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB直⽅图匹配
直⽅图匹配或叫做直⽅图规定化都可以,是把原图像的直⽅图按照给定的直⽅图加以映射,使新图像的直⽅图的分布类似于给定的函数。
总共有以下⼏步:
1.求给定的函数的累积直⽅图s。
2.求原图像的累积直⽅图G。
3.求s中每⼀个值在G中距离最⼩的位置index。
4.求原图像每个像素通过index映射到的新像素的值。
代码如下:
1 clear all;
2 close all;
3 clc;
4
5 r=127;
6 x=-r:r+1;
7 sigma=20;
8 y1=exp(-((x-80).^2)/(2*sigma^2));
9 y2=exp(-((x+80).^2)/(2*sigma^2));
10 y=y1+y2; %双峰⾼斯函数,任意函数都可以
11
12 %im=imread('bg.bmp'); %匹配⼀个图像的直⽅图
13 %y=imhist(im);
14 y=y/sum(y); %归⼀化,使函数符合概率分布的sum(y)==1这样⼀个规律
15 plot(y); %待匹配的直⽅图
16
17 G=[]; %函数的累积直⽅图
18for i=1:256
19 G=[G sum(y(1:i))];
20 end
21
22 img=imread('lena.jpg');
23 [m n]=size(img);
24 hist=imhist(img); %待处理图像的直⽅图
25 p=hist/(m*n);
26 figure;plot(p) %原图直⽅图
27
28 s=[]; %待处理图像的累积直⽅图
29for i=1:256
30 s=[s sum(p(1:i))];
31 end
32
33for i=1:256
34 tmp{i}=G-s(i);
35 tmp{i}=abs(tmp{i}); %因为要找距离最近的点,所以取绝对值
36 [a index(i)]=min(tmp{i}); %找到两个累积直⽅图距离最近的点
37 end
38
39 imgn=zeros(m,n);
40for i=1:m
41for j=1:n
42 imgn(i,j)=index(img(i,j)+1)-1; %由原图的灰度通过索引映射到新的灰度
43 end
44 end
45
46 imgn=uint8(imgn);
47 figure;imshow(imgn)
48 figure;plot(imhist(imgn)) %新图的直⽅图效果如下:
给定的直⽅图
原图
原图直⽅图
变换后的直⽅图
最后的结果。