编程提升:一起读源码

时间:2024-03-22 12:40:53

MATLAB imadjust()函数 (图像调整函数)

imadjust()函数是MATLAB中非常常用的函数,它的功能是可以调节图像的亮度,带来视觉上的美化图像,所有理解这个源码是很有用的,接下来让我们慢慢的变秃(强)吧~

1.matlab在哪里看源码

2.翻译注释,理解imadjust()的用处

3.举个栗子

4.认真看别人怎么写的源码

1.matlab在哪里看源码

首先,我们应该在哪里查看MATLAB的源码呢。我用的是MATLAB 7.8.0版本的,是2009年3月6日发布的,发布名称是R2009a。
很简单,只需要打开MATLAB,然后输入open xxxx(你想要查看的函数它的源码),就可以了。
编程提升:一起读源码
open imadjust 按一下回车,就会跳出imadjust的源码文件了
编程提升:一起读源码
PS:如果你英语学得好,理解起来会简单很多~
先看第一行,就像c语言的void xxx()一样,意思是定义一个函数,当然这个函数就是我们要学习的imadjust()函数了。

2.翻译注释,理解imadjust()的用处

接下来先看逐行翻译注释(百度翻译)
编程提升:一起读源码
IMADJUST调整图像强度值或颜色。
编程提升:一起读源码
J=IMADJUST(I)将强度图像I中的值映射到J中的新值
因此,1%的数据在低强度和高强度的I下是饱和的。
这增加了输出图像J的对比度。
编程提升:一起读源码
J=IMADJUST(I,[LOW_-IN;HIGH_-IN],[LOW_-OUT;HIGH_-OUT])将强度图像I中的值映射到J中的新值,使得LOW_-IN和HIGH_-IN之间的值映射到LOW_-OUT和HIGH_-OUT之间的值。
LOW_-IN以下和HIGH_-IN以上的值将被剪裁;即LOW_-IN以下的值映射到LOW_-OUT,HIGH_-IN以上的值映射到HIGH_-OUT。
您可以使用空矩阵([])来指定[LOW_-IN;HIGH_-IN]或[LOW_-OUT;HIGH_-OUT]的默认值[0 1]。如果省略参数,[LOW_OUT;HIGH_OUT]默认为[0 1]。
编程提升:一起读源码
J=IMADJUST(I,[LOW_-IN;HIGH_-IN],[LOW_-OUT;HIGH_-OUT],GAMMA)将I的值映射到J中的新值,如前一语法所述。
GAMMA指定描述I和J中的值之间关系的曲线形状。
如果GAMMA小于1,则映射将向更高(更亮)的输出值加权。
如果GAMMA大于1,映射将向较低(较暗)的输出值加权。如果省略参数,GAMMA默认为1(线性映射)。
编程提升:一起读源码
NEWMAP=IMADJUST(MAP,[LOW_-IN;HIGH_-IN],[LOW_-OUT;HIGH_-OUT],GAMMA)变换与索引图像关联的颜色映射。
如果LOW_-IN、HIGH_-IN、LOW_-OUT、HIGH_-OUT和GAMMA是标量,则相同的映射适用于红色、绿色和蓝色组件。
当LOW_-IN和HIGH_-IN都是1×3向量,LOW_-OUT和HIGH_-OUT都是1×3向量,或者GAMMA是1×3向量时,每个颜色分量的唯一映射是可能的。
重新缩放的颜色映射NEWMAP与MAP的大小相同。
编程提升:一起读源码
RGB2=IMADJUST(RGB1,…)对RGB图像RGB1的每个图像平面(红色、绿色和蓝色)执行调整,与颜色映射调整一样,可以将唯一映射应用于每个平面。
编程提升:一起读源码
注意IMADJUST(I)等同于IMADJUST(I,STRETCHLIM(I))。
编程提升:一起读源码
请注意,如果HIGH_OUT<LOW_OUT,输出图像将反转,如在照相底片中。
编程提升:一起读源码

支持教学
————
对于包含输入图像(而不是颜色映射)的语法,输入图像可以是uint8、uint16、int16、double或single。
输出图像与输入图像具有相同的类。对于包含colormap的语法,输入和输出colormaps是双支撑。
编程提升:一起读源码
版权所有1992-2007 The MathWorks,Inc。
5.26.4.9版次:5.26.4.9日期:2007/12/10 21:37:18$
编程提升:一起读源码
输入输出规格
————
I J real(实数),full matrix(全矩阵) 2-D(二维)
uint8, uint16, double, single, int16
编程提升:一起读源码
这个是RGB(彩图)的输入输出规格
real(实数),full matrix(全矩阵) 2-D(二维)
M-by-N-by-3(意思是MN3)
uint8, uint16, double, single, int16
编程提升:一起读源码
MAP,NEWMAP real(实数),full matrix(全矩阵)
M*3
值在[0,1]范围内的双精度值。
编程提升:一起读源码
双实全矩阵
%对I来说,大小只能是2个元素。
%对于RGB或MAP,大小可以是2个元素或其他
%2乘3矩阵。
% LOW_IN < HIGH_IN
编程提升:一起读源码
[低输入;高输出]与[低输入;高输入]相同的大小限制
%低输出要小于高输出
编程提升:一起读源码
低进,高进,低出,高出都必须在[0,1]范围内;
编程提升:一起读源码
GAMMA real(实数),double,nonnegative(非负数)
%I是标量
%RGB和MAP是标量或1乘3矢量

这个imadjust的源码注释到此为止啦,那么他讲了什么呢

1.这个函数的作用
2.这个函数每个参数的用法和说明
3.举了个小栗子(等下我试试)
4.版权所有
(MATLAB是开放源代码的,所有我们很容易看到里面的内容)
而有的软件是不开发源代码的,你只能使用,但是不知道他的更多信息。

3.源码里举的栗子

编程提升:一起读源码
例子
————
我们试试看他的例子,代码原封不动,只把注释符号删了,把图片换成了我有的图片,让我们看看效果。
编程提升:一起读源码
编程提升:一起读源码编程提升:一起读源码
结果是报错,为什么呢,因为第一幅图是不支持彩色图像的,那我们换成一副图像试试。
编程提升:一起读源码
换成这个,再运行一次看看。
编程提升:一起读源码
图1是灰度原图,图2是按照imadjust默认值变化后输出的图,图3改变了LOW_IN和HIGH_IN后输出的图。图4是彩色原图,图5是改变后输出的图。
我们通过这个例子可以很明显的看出图像的变化,这就是这一个imadjust函数例子的作用,至于图像有没有变好看,什么样算好看,这个取决于个人的审美标准~

4.认真看别人怎么写的源码

看完了注释,举了个栗子,其实就明白很多东西了,那么接下来就看看看imadjust的本体,那些没打注释符的内容。
编程提升:一起读源码
%分析输入并初始化变量

[图像,图像类型,低输入,高输入,低输出,高输出,伽马]=解析输入()
PS:伽马gamma就是编程提升:一起读源码幂次方程的幂指数。
我们跳过去看看解析输入函数的内容,鼠标放在编程提升:一起读源码上,然后点击右键,按Ctrl+D。
然后我们就知道这个解析输入函数的具体内容是什么了,
编程提升:一起读源码
把他旁边的➖点一下,就知道他是196-270行。
有很多,这个解析我们认真的看一看,是怎么完成的。
编程提升:一起读源码
%默认值
最低最高的输入为0;1
最低最高的输出为0;1
伽马=1
编程提升:一起读源码
如果函数输入变量数为1,就是imadjust(I),可以参照我们之前举的栗子,也就是说,他只有图像这一个输入的东西,其他的一切都是默认值。
并且,如果数组的维度~=2(不是二维的的)
报错(“[email protected]#$%^&*”),文件运行不了
iptcheckinput()检查数组的有效性
编程提升:一起读源码
%如果一个用户通过一个m×3的双数组,假设它是一个强度图像(真的没有办法分辨)。
编程提升:一起读源码
关闭警告图片,并且随后还原图片
编程提升:一起读源码
或者,如果函数输入变量数为2
如果函数输入不为空
那么输入的lowhigh_in就是第两个参数
编程提升:一起读源码
又或者如果函数输入变量数为3个
并且输入不为空
那么输入lowhigh_in是第二个参数
输出lowhigh_out是第三个参数
编程提升:一起读源码
又又或者输入的四个都不为空,那么就有四个参数
那么输入lowhigh_in是第二个参数
输出lowhigh_out是第三个参数
gamma是第四个参数
嗯,这个源码写的有理有据,再往下看
编程提升:一起读源码
图片类型为findimagetype(),这个函数在272行(不细说)
检查范围checkRange(),这个函数在296行(不细说)
编程提升:一起读源码
分流范围splitRange(),这个函数在317行(不细说)
以上197-270行的代码就全部讲完了,具体讲的就是对输入的解析,包括图片类型,数值范围,默认值以及报错。
然后再往下看
编程提升:一起读源码
validateLowHigh()函数对lowIn,highIn,lowOut,highOut的验证,代码在336行。
validateGamma()函数对gamma,imageType)的验证,代码在358行。
编程提升:一起读源码
如果是包含65536个以上元素的整数数据类型图像,那么输出就是adjustWithLUT(),代码在131行
编程提升:一起读源码
或者不改变图像的类型
如果图像是双double型
就改变图像类型,变成double型的图像
编程提升:一起读源码
如果是强度图像,那么输出adjustGrayscaleImage(),代码在171行
如果是索引图像,那么输出adjustColormap(),代码在164行
或者输出真彩色图像adjustTruecolorImage(),代码在177行
编程提升:一起读源码
如果图像类型改变了,就输出改变后的图像。
至此,该源码结束。
学习过程就是一点点的天才加很多很多的努力和耐心~革命尚未成功,同志仍需努力!