stretchlim函数分析
在看imadjust代码时,看到stretchlim函数,特此分析一下,代码注释如下
function lowhigh = stretchlim(varargin)
%STRETCHLIM Find limits to contrast stretch an image.
% LOW_HIGH = STRETCHLIM(I,TOL) returns a pair of gray values that can be
% used by IMADJUST to increase the contrast of an image.
%
% TOL = [LOW_FRACT HIGH_FRACT] specifies the fraction of the image to
% saturate at low and high pixel values.
%
% If TOL is a scalar, TOL = LOW_FRACT, and HIGH_FRACT = 1 - LOW_FRACT,
% which saturates equal fractions at low and high pixel values.
%
% If you omit the argument, TOL defaults to [0.01 0.99], saturating 2%.
%
% If TOL = 0, LOW_HIGH = [min(I(:)); max(I(:))].
%
% LOW_HIGH = STRETCHLIM(RGB,TOL) returns a 2-by-3 matrix of pixel value
% pairs to saturate each plane of the RGB image. TOL specifies the same
% fractions of saturation for each plane.
%
% Class Support
% -------------
% The input image can be uint8, uint16, int16, double, or single, and must
% be real and nonsparse. The output limits are double and have values
% between 0 and 1.
%
% Note
% ----
% If TOL is too big, such that no pixels would be left after saturating
% low and high pixel values, then STRETCHLIM returns [0; 1].
%
% Example
% -------
% I = imread('pout.tif');
% J = imadjust(I,stretchlim(I),[]);
% figure, imshow(I), figure, imshow(J)
%
% See also BRIGHTEN, DECORRSTRETCH, HISTEQ, IMADJUST. % Copyright 1999-2005 The MathWorks, Inc.
% $Revision: 1.7.4.8 $ $Date: 2005/11/15 01:02:11 $ [img,tol] = ParseInputs(varargin{:}); if isa(img,'uint8')
nbins = 256;
else
nbins = 65536;
end tol_low = tol(1);
tol_high = tol(2); % 获取第三维的维数
p = size(img,3); if tol_low < tol_high
ilowhigh = zeros(2,p);
% 对于第三维的每一层进行寻找
for i = 1:p % Find limits, one plane at a time
N = imhist(img(:,:,i),nbins);
cdf = cumsum(N)/sum(N); %cumulative distribution function
ilow = find(cdf > tol_low, 1, 'first'); %找到满足累计频率>tol_low的下标
ihigh = find(cdf >= tol_high, 1, 'first'); %找到满足累计频率>=tol_low的下标
if ilow == ihigh % this could happen if img is flat
ilowhigh(:,i) = [1;nbins];
else
ilowhigh(:,i) = [ilow;ihigh];
end
end
lowhigh = (ilowhigh - 1)/(nbins-1); % convert to range [0 1] else
% tol_low >= tol_high, this tolerance does not make sense. For example, if
% the tolerance is .5 then no pixels would be left after saturating
% low and high pixel values. In all of these cases, STRETCHLIM
% returns [0; 1]. See gecks 278249 and 235648.
lowhigh = repmat([0;1],1,p);
end %-----------------------------------------------------------------------------
function [img,tol] = ParseInputs(varargin) iptchecknargin(1, 2, nargin, mfilename); img = varargin{1};
iptcheckinput(img, {'uint8', 'uint16', 'double', 'int16', 'single'}, {'real', ...
'nonsparse'}, mfilename, 'I or RGB', 1);
if (ndims(img) > 3)
msgId = 'Images:stretchlim:dimTooHigh';
error(msgId,'STRETCHLIM only supports individual images.');
end % 默认值
tol = [.01 .99]; %default
if nargin == 2
tol = varargin{2};
switch numel(tol) %判断tol数组元素个数
case 1
tol(2) = 1 - tol; case 2
if (tol(1) >= tol(2))
msgId = 'Images:stretchlim:invalidTolOrder';
error(msgId,'TOL(1) must be less than TOL(2).');
end
otherwise
msgId = 'Images:stretchlim:invalidTolSize';
error(msgId,'TOL must have 1 or 2 elements.');
end
end if ( any(tol < 0) || any(tol > 1) || any(isnan(tol)) )
msgId = 'Images:stretchlim:tolOutOfRange';
error(msgId,'TOL must be in the range [0 1].');
end
主函数为stretchlim,其中子函数ParseInputs用于获取参数。
主函数中关键部分为
if tol_low < tol_high
ilowhigh = zeros(2,p);
% 对于第三维的每一层进行寻找
for i = 1:p % Find limits, one plane at a time
N = imhist(img(:,:,i),nbins);
cdf = cumsum(N)/sum(N); %cumulative distribution function
ilow = find(cdf > tol_low, 1, 'first'); %找到满足累计频率>tol_low的下标
ihigh = find(cdf >= tol_high, 1, 'first'); %找到满足累计频率>=tol_low的下标
if ilow == ihigh % this could happen if img is flat
ilowhigh(:,i) = [1;nbins];
else
ilowhigh(:,i) = [ilow;ihigh];
end
end
lowhigh = (ilowhigh - 1)/(nbins-1); % convert to range [0 1]
函数imhist是用于获取图像数据直方图,返回值是个一维矩阵,保存着图像中每个灰度等级的像素个数,如上,如果nbins等于256,代表灰度范围为0~255,则imhist获取图像img中符合每个灰度等级的像素个数,例如灰度等级3对应数组N下标4,图像中灰度等级为3的像素个数为5,则N(4)=5。
cdf = cumsum(N)/sum(N);
这一行中cumsum(N)计算一个数组各个元素的累加值,例如数组 N = [1 3 5],则cumsum(N) = [1 4 9],sum(N)获取数组N的元素个数,因此这个式子代表意思是每个灰度等级的累积频率,例子中sum(N)=3,则cdf=[1/3 4/3 9/3]。
ilow = find(cdf > tol_low, 1, 'first'); %找到满足累计频率>tol_low的下标
ihigh = find(cdf >= tol_high, 1, 'first'); %找到满足累计频率>=tol_low的下标
找到下标ilow和ihigh,可对应满足条件的灰度等级,因为cdf数组中下标也就是对应灰度等级的值加1。
lowhigh = (ilowhigh - 1)/(nbins-1); % convert to range [0 1]
归一化,将范围[ilow ihigh]映射到[0 1]
stretchlim函数分析的更多相关文章
- split(),preg_split()与explode()函数分析与介
split(),preg_split()与explode()函数分析与介 发布时间:2013-06-01 18:32:45 来源:尔玉毕业设计 评论:0 点击:965 split()函数可以实 ...
- string函数分析
string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把 ...
- start_amboot()函数分析
一.整体流程 start_amboot()函数是执行完start.S汇编文件后第一个C语言函数,完成的功能自然还是初始化的工作 . 1.全局变量指针r8设定,以及全局变量区清零 2.执行一些类初始化函 ...
- uboot的jumptable_init函数分析
一.函数说明 函数功能:安装系统函数指针 函数位置:common/exports.c 二.函数分析 void jumptable_init (void) { int i; gd->jt = (v ...
- Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析
Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...
- 31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待
在上章和上上上章: 28.QT-QPainter介绍 30.QT-渐变之QLinearGradient. QConicalGradient.QRadialGradient 学习了QPainter基础绘 ...
- 如何验证一个地址可否使用—— MmIsAddressValid函数分析
又是一篇内核函数分析的博文,我个人觉得Windows的内核是最好的老师,当你想实现一个功能之前可以看看Windows内核是怎么做的,说不定就有灵感呢:) 首先看下官方的注释说明: /*++ Routi ...
- STM32F10X固件库函数——串口清状态位函数分析
STM32F10X固件库函数——串口清状态位函数分析 最近在测试串口热插拔功能的时候,意外发现STM32F10X的串口库函数中,清理串口状态位函数稍稍有点不解.下面是改函数的源码: /******** ...
- 常用string函数分析
string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把 ...
随机推荐
- WordPress插件制作教程(八): 最后总结
WordPress插件教程最后一篇,还是为大家简单的做下总结.这次插件制作教程讲的内容和知识点个人觉得不是很多,因为插件制作不单单是这些内容,它涉及的知识很多很多,不是说你会一些函数就可以做出一个好的 ...
- Spark学习笔记-如何运行wordcount(使用jar包)
IDE:eclipse Spark:spark-1.1.0-bin-hadoop2.4 scala:2.10.4 创建scala工程,编写wordcount程序如下 package com.luoga ...
- 搭建MHA环境【2】安装mysql-5.6 + mysql复制
本例中mysql的安装方式选用了二进制包安装方案.mysql复制用半同步复制方案 [1]安装mysql-5.6.31 要在所有的数据节点上都安装上mysql,安装方式大致相同,所以我这里就不重复写多次 ...
- Android广播机制(转)
1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者,通常情况下,BroadcastReceiver指的就是广播接收者(广播接收器).广播作为Android组件间的通 ...
- IOS 面试 --- 动画 block
1 谈谈对Block 的理解?并写出一个使用Block执行UIVew动画? 答案:Block是可以获取其他函数局部变量的匿名函数,其不但方便开发,并且可以大幅提高应用的执行效率(多核心CPU可直接处理 ...
- CActiveForm提示中文化
一般情况下,yii框架的CActiveForm组建的提示是英文的,把它改成中文提示 首先在main.php配置文件中,设置 'language'=>'zh_cn'; 这样将会使得cannot b ...
- MVC入门之.Net语法学习
本节中主要学习.Net框架性语法.开发者可以使用新语法提高编程的效率以及代码的运行效率:其本质都是“语法糖”,由编译器在编译时转成原始语法. u 自动属性 Auto-Implemented Prop ...
- 模拟IIC总线汇编程序软件包
一.概述 为了非常方便地对 I2C 从器件进行快速的.正确的读写操作,我们为此而设计出虚拟 I2C 总线操作平台软件包.本软件包是主方式下的虚拟 I2C 总线软件包,只要用户给子程序提供几个主要的参数 ...
- OpenSceneGraph是一个开源的三维引擎
http://www.osgchina.org/OpenSceneGraph是一个开源的三维引擎,被广泛的应用在可视化仿真.游戏.虚拟现实.科学计算.三维重建.地理信息.太空探索.石油矿产等领域.OS ...
- 无人参与安装IIS 6.0
使用脚本安装 IIS 从“开始”菜单,单击“运行”. 在“打开”框中,键入 cmd,然后单击“确定”. 在命令提示符下,键入 Sysocmgr.exe /i:sysoc.inf /u:%path_to ...