直方图规定化

原理
所谓直方图规定化,就是通过一个灰度映像函数,将原灰度直方图改造成所希望的直方图。说的通俗一点就是,原图像的灰度是从0~255的,其分布是随机的,在一些情况下,我们可能需要一些特定的灰度值,比如我们只需要灰度值为0 3 40 240 255 这些值,除此之外的灰度值我们不需要,那么从原图像到我们需要的图像就可以理解成图像的规定化。

具体事例
左图是原图像的灰度直方图,右图是我们需要的图(这里的需要是指需要灰度由原来的0~7变成规定的1 3 6,规定化后图像的纵坐标是会变的,这里只需要横坐标吻合就行!)

规定化后的图像(横坐标和规定一样,纵坐标是会变化的):

实现步骤:

  1. 分别计算出原图像和规定图像的累加直方图
  2. 利用SML或者GML映射灰度值
  3. 利用更新后的映射表转换原图像的灰度值

看完之后,应该还是不懂?那么直接实战一题!题目见下图:

解题步骤:

  1. 这里是直接给出的原图像各灰度的像素个数,为了得到我们需要的直方累加图(其实是概率累加值,当然也可以不用概率,直接用像素点数也行,就是看起来数字比较大),需要先算出原图像各灰度的概率(占总像素个数的比例),然后在计算累加值
  2. 根据给出的规定直方图,同样的方法计算累加直方图,见下图
  3. 利用SML映射规则得出结果
  4. 利用映射变化表,更新原图像

提示

这里可能不懂SML映射规则,我说说自己简单的理解(自己也可以自行百度):
SML就是单映射,这里我们关注原图累加直方图和规定累加直方图,所谓SML,就是从原图累加直方图开始,在规定累加直方图寻找和自己最接近的值,然后把它的灰度值变成自己的。具体来说,原图第一个累加概率是0.19,在规定累加直方图中,最接近它的就是0.15,那么原图的灰度0变成规定的3,第二个累加概率是0.44,最接近规定累加直方图的0.35,所以由1变成4,同理,依次遍历完原图累加直方图的概率就行,在规定累加直方图找到最靠近自己的值,最后进行灰度变化。

SML规则懂了,GML规则也就好理解了(GML规则其实编程更难):

SML中,我们是依次遍历原图累加直方图,在规定累加直方图寻找最靠近自己的。在GML(组映射)中,就变成了依次从规定累加直方图中,对比原图累加直方图,也是找到最靠近的值,进行灰度变换,只是这里的变换规则变了。

具体举例来说,从上图看,这里我们这里从规定累加直方图的0.15看,前面的0其实不用看,再从原始累加直方图找到最接近0.15的值,是0.19,那么0.19对应和它对应灰度值前面的灰度变成规定累加直方图中0.15所对应的灰度值:3;第二个看规定累加直方图的0.35,靠近原图的0.44,那么原图的1变成4(假设这里0.44对应的原图灰度值为4,那么在前一个不为0和4之间变成4)
这里有的不好理解,举个例子:
原数组:1 0 0 2 0 3 0 0 0 4 0 0 6
GML映射变化规则的目标数组就是:1 2 2 2 3 3 4 4 4 4 6 6 6
解释:1前面的数变为1,1和2之间变成2,2和3之间变成3,3和4之间变成4,4和6之间变成6,简单的说就是变0变成后面最靠近的一个不为0的数。(这里算法自己需要掌握,即如何从原数组变成目标数组,这里先给个C++的验证算法)

#include<iostream>
using namespace std;
int main()
{int t[8]={2,0,1,0,3,0,0,6};int i,j;int tem;int flag=0;for (i=0;i<8;i++){if(t[i]==0){for(j=i;j<8;j++){if(t[j]!=0){tem=t[j];break;}}t[i]=tem;}}
for(i=0;i<8;i++)
cout<<t[i]<<" ";
return 0;
}

如果还是不懂SML和GML规则的话?那自己根据下面两种图片再理解理解吧。

MATLAB实战
原理懂了,肯定就是要开始实战了啊!
这里我先上全部代码:

 t=imread('a1.jpg')
%获取图片的长和宽,用于计算总像素,即m*n
[m,n]=size(t);%n_1 这里是先统计各灰度的像素数,后面会变换为概率
n_1=zeros(1,256);%统计各灰度的像素数
for i=1:m
for j=1:n
n_1(t(i,j)+1)=n_1(t(i,j)+1)+1;
end
end%转换为概率
n_1=n_1/m/n; %计算各个灰度级的概率%p_1  记录原图的累积直方图概率
p_1=zeros(1,256);%p_1 计算原始累积直方图的概率
for i=1:256
for j=1:i
p_1(i)=p_1(i)+n_1(j);
end
end%n_2  规定直方图的灰度概率分布
n_2=[zeros(1,50),0.1,zeros(1,50),0.2,zeros(1,50),0.3,zeros(1,50),0.2,zeros(1,20),0.1,zeros(1,30),0.1];%p_2 记录规定直方图的累积概率
p_2=zeros(1,256);% 计算规定直方图累积概率
for i=1:256
for j=1:i
p_2(i)=p_2(i)+n_2(j);
end
end%SML映射算法
data_1=zeros(1,256);%data_1 SML映射表for i=1:256
min=abs(p_1(i)-p_2(1));
for j=2:256
if  abs(p_1(i)-p_2(j))<min
min=abs(p_1(i)-p_2(j));
data_1(i)=j-1;
end
end
end%GMLdata_2=zeros(1,256); %data_2记录GML映射表for i=1:256
if n_2(i)~=0
tem=1;
min=abs(p_2(i)-p_1(1));
for j=2:256
if abs(p_2(i)-p_1(j))<min
min=abs(p_2(i)-p_1(j));
tem=j;
end
end
data_2(tem)=i-1;
end
end%将上面得到的data_2 转换为目标数组(原理解释有c++算法)
for i=1:256
if data_2(i)==0
for j=i:256
if data_2(j)~=0
tem=data_2(j);
break;
end
end
data_2(i)=tem;
end
end%利用SML、GML映射表,转换原图像
t2=t;
t3=t;%转换算法
for i=1:m
for j=1:n
t2(i,j)=data_1(t(i,j)+1);
end
end
for i=1:m
for j=1:n
t3(i,j)=data_2(t(i,j)+1);
end
end%显示
subplot(3,2,1),imshow(t),title('原图')
subplot(3,2,2),imhist(t),title('原图')
subplot(3,2,3),imshow(t2),title('SML')
subplot(3,2,4),imhist(t2),title('SML')
subplot(3,2,5),imshow(t3),title('GML')
subplot(3,2,6),imhist(t3),title('GML')

效果图:

总结

SML、GML两个算法用来一天才搞清楚原理,书上的公式开始看真的是好难啊,看不进去,网上的方法,真的是,没有自己想要的。算法其实一天就搞定了,当时由于MATLAB语法还不是很熟,走了很多弯路。下面总结下自己的踩坑吧:

  • MATLAB里面的循环写法 for i=1:256 c++:for(i=1;i<=256;i++)
  • for、if等用end结束,end个数必须和if、for配对,比如,3个for,2个if,就必须有5个end结束,不然程序会一直执行下去
  • 程序语句最后有无 ; 的区别:写了 ; 本地代码区不会显示具体数据,反之不写,则会显示,建议还是写吧,和c++语法类似。
  • 多打印数据,一步一步调试,便于寻找bug

MATLAB--数字图像处理 图像直方图规定化相关推荐

  1. Matlab数字图像处理——图像的空间变换

    Matlab空间变换函数 imtransform Matlab空间变换函数 imtransform 可以实现图像仿射变换(如 平移.旋转.剪切.缩放).投影变换, 该函数可与 maketform 配合 ...

  2. matlab数字图像处理——图像的读写,灰度、二值图像

    一.实验目的 1.结合数字图像处理的知识,直观感受图像处理的基本实现过程 2.熟悉MATLAB工具的使用 3.了解图像的读写和显示 二.实验内容 实验内容一:图像读取 (1)利用编程实现读取图像 利用 ...

  3. Matlab数字图像处理——图像处理工具箱Image Processing Toolbox

    Image Processing Toolbox 图像处理工具箱包含的功能: 图像的读取和保存 图像的显示 创建GUI 图像的几何变换 图像滤波器设计及线性滤波 形态学图像处理 图像域变换 图像增强 ...

  4. Matlab数字图像处理——图像文件的读取

    文章目录 一.Matlab中获取图像信息的函数 imfinfo 二.Matlab读取图像文件的函数 imread 三.Matlab保存图像文件的函数 imwrite 完整目录 一.Matlab中获取图 ...

  5. matlab 求其骨架,数字图像处理图像的骨架生成和提取(Matlab)三种方法

    [实例简介] 数字图像处理图像的骨架生成和提取(Matlab),有三种方法,推荐给大家! [实例截图] [核心代码] Programe ├── Programe1 │   ├── 00.JPG │   ...

  6. 【数字图像处理】直方图均衡化与规定化

    目录 直方图处理技术概述 直方图均衡化 公式推导 Matlab代码实现 图像的规定化 数学推导 单映射 Matlab代码 效果展示​编辑 组映射 Matlab代码 直方图处理技术概述 灰度级范围[0, ...

  7. matlab图像低通滤波器 实验报告,基于matlab数字图像处理之低通滤波器

    <基于matlab数字图像处理之低通滤波器>由会员分享,可在线阅读,更多相关<基于matlab数字图像处理之低通滤波器(6页珍藏版)>请在人人文库网上搜索. 1.实践一:理想低 ...

  8. MATLAB数字图像处理系统[多功能]

    MATLAB数字图像处理系统[多功能] 目录 实验一 MATLAB数字图像处理初步 实验二 图像的代数运算 实验三 图像增强-空间滤波 实验四 图像分割 2 实验一 MATLAB数字图像处理初步 一. ...

  9. MATLAB数字图像处理系统-形状分类

    MATLAB数字图像处理系统-形状分类 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...

  10. MATLAB 数字图像处理GUI二值图像实验

    电信19-2 翁大弟 摘要 图像信息是人类获取信息的重要来源及利用信息的重要手段,数字图像处理的产生和迅速发展主要受三个因素的影响:一是计算机的发展:二是广泛的农牧业.环境.军事.工业等方面的应用需求 ...

最新文章

  1. cache-control_网站 cache control 最佳实践
  2. MySQL - Join关联查询优化 --- NLJ及BNL 算法初探
  3. IOS7的一个神奇的Bug
  4. python 动态导入类_从动态导入模块中类的字符串名动态实例化?
  5. 间接银团贷款(Indirectly Syndicated Loan/PARTICIPATED)
  6. 状态码202_至少 10 个 HTTP 状态码
  7. python第一个程序--hello world
  8. Java ResultSet教程
  9. 阿里面试官的分享Java面试中需要准备哪些多线程并发的技术要点
  10. 独家!337页大数据与建模核心资料,免费领取!
  11. opengl大作业c语言,openGL-计算机图形大作业中出现的几个错误及解决
  12. word数学公式快捷键-高效率办公技能get
  13. 华为手机鸿蒙系统卡吗,鸿蒙到底有多流畅?华为:3年不卡!
  14. 欢迎使用CSDN-markdown编辑器萨达所大所大所大所
  15. 算法笔记 分治:循环赛日程 棋盘覆盖 选择问题 输油管问题 整数因子分解
  16. 分享一下开女装服装加盟店的赚钱攻略
  17. JAVA字符串中字符类型的识别和分类(汉字、数字、字母、特殊符号等)
  18. 如何去图片水印?三个方法让你学会图片去水印
  19. .tar和.tar.gz的区别
  20. matlab多元变量最优解,模拟退火算法确定多个变量的最优解

热门文章

  1. 微信unionid机制
  2. 幼儿园编程机器人课程介绍
  3. windos读写ext3工具_“ ext2fsd” Windows系统工具,用于读写ext2 / 3/4文件系统
  4. c语言malloc(c语言malloc头文件)
  5. 通信教程 | CAN总线协议基础原理
  6. 转载“用USBOOT制作DOS启动盘”
  7. 如何批量将 psd 转换为 png、jpeg、bmp、svg、webp 格式
  8. yandex 插件_Yandex Metrika的Vue插件
  9. BT601和BT709到底什么关系
  10. php中in array函数_PHP函数in_array()使用详解