一杯清酒邀明月
天下本无事,庸人扰之而烦耳。
posts - 3121,comments - 209,views - 578万

  直方图匹配或叫做直方图规定化都可以,是把原图像的直方图按照给定的直方图加以映射,使新图像的直方图的分布类似于给定的函数。

  总共有以下几步:

  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=[];               %函数的累积直方图
18 for 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=[];                   %待处理图像的累积直方图
29 for i=1:256
30     s=[s sum(p(1:i))];
31 end
32 
33 for 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);
40 for i=1:m
41    for 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))       %新图的直方图
复制代码

效果如下:

给定的直方图

原图

原图直方图

变换后的直方图

最后的结果

posted on   一杯清酒邀明月  阅读(1428)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示