当前位置: 首页 > news >正文

matlab练习程序(直方图匹配)

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

  总共有以下几步:

  1.求给定的函数的累积直方图s。

  2.求原图像的累积直方图G。

  3.求s中每一个值在G中距离最小的位置index。

  4.求原图像每个像素通过index映射到的新像素的值。

代码如下:

clear all;
close all;
clc;

r=127;                              
x=-r:r+1;
sigma=20;
y1=exp(-((x-80).^2)/(2*sigma^2));
y2=exp(-((x+80).^2)/(2*sigma^2));
y=y1+y2;                        %双峰高斯函数,任意函数都可以

%im=imread('bg.bmp');  %匹配一个图像的直方图
%y=imhist(im);
y=y/sum(y);         %归一化,使函数符合概率分布的sum(y)==1这样一个规律
plot(y);            %待匹配的直方图

G=[];               %函数的累积直方图
for i=1:256
   G=[G sum(y(1:i))]; 
end

img=imread('lena.jpg');
[m n]=size(img);
hist=imhist(img);       %待处理图像的直方图
p=hist/(m*n);           
figure;plot(p)          %原图直方图

s=[];                   %待处理图像的累积直方图
for i=1:256
    s=[s sum(p(1:i))];
end

for i=1:256
    tmp{i}=G-s(i);
    tmp{i}=abs(tmp{i});         %因为要找距离最近的点,所以取绝对值
    [a index(i)]=min(tmp{i});   %找到两个累积直方图距离最近的点
end

imgn=zeros(m,n);
for i=1:m
   for j=1:n
      imgn(i,j)=index(img(i,j)+1)-1;    %由原图的灰度通过索引映射到新的灰度
   end
end

imgn=uint8(imgn);
figure;imshow(imgn)
figure;plot(imhist(imgn))       %新图的直方图

效果如下:

给定的直方图

原图

原图直方图

变换后的直方图

最后的结果

 

相关文章:

  • TortoiseSvn介绍
  • C#中Monitor和Lock以及区别
  • HDU 1575 Tr A (矩阵乘法)
  • MVC使用基架添加控制器出现的错误:无法检索XXX的元数据
  • 从程序员的视角揭秘Silverlight
  • oracle索引再论
  • Android应用开发学习笔记之多线程与Handler消息处理机制
  • jquery $.each() 小探
  • HDU 4089 Activation
  • Linux 上安装 Subversion
  • PHP5.4第二天——数组、多维数组和数组函数
  • MySQL数据库中delimiter的作用概述
  • unigui验证微信服务器的有效性
  • python PIL except: IOError: decoder jpeg not available
  • Pyp 替代sed,awk的文本处理工具
  • 《剑指offer》分解让复杂问题更简单
  • 【5+】跨webview多页面 触发事件(二)
  • 【个人向】《HTTP图解》阅后小结
  • emacs初体验
  • gulp 教程
  • Java程序员幽默爆笑锦集
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 搭建gitbook 和 访问权限认证
  • 关于for循环的简单归纳
  • 面试遇到的一些题
  • 前端_面试
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #1014 : Trie树
  • $.proxy和$.extend
  • (1)(1.13) SiK无线电高级配置(六)
  • (Ruby)Ubuntu12.04安装Rails环境
  • (二十四)Flask之flask-session组件
  • (规划)24届春招和25届暑假实习路线准备规划
  • (力扣题库)跳跃游戏II(c++)
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (学习日记)2024.03.12:UCOSIII第十四节:时基列表
  • (转)IIS6 ASP 0251超过响应缓冲区限制错误的解决方法
  • (转)程序员技术练级攻略
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .net core 6 集成和使用 mongodb
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .net与java建立WebService再互相调用
  • .NET中的Exception处理(C#)
  • .NET中统一的存储过程调用方法(收藏)
  • @cacheable 是否缓存成功_让我们来学习学习SpringCache分布式缓存,为什么用?
  • @ModelAttribute使用详解
  • @RequestBody详解:用于获取请求体中的Json格式参数