图像处理:灰度图片线性截断拉伸

news2025/1/20 19:21:32

1. 为什么要拉伸

       很多时候,灰度图片的灰度级较大,而像素值的分布比较集中,这就导致灰度级的利用率过低,从而导致图片的对比度很小,人眼的感官体验很不好,因此我们通常需要对原始的图像数据进行拉伸调整,增加图片的对比度以适应人眼观察。当前很多红外摄像机拍摄的图像为灰度图,通常使用8、14或者16个比特位取保存一个像素值,那么其灰度级分别为255、16383、65535,灰度级表示了像素值的取值范围,其值越大,可表达的细节越细腻。通常情况下,相机拍摄的灰度图片,其实际的像素取值范围,并不会均匀地分布在灰度级范围之内,而是集中在一小段范围内,比如图1所示,一张16位的红外图像,其像素值的取值集中在[12560,13584]范围之内,其灰度级利用率仅为1.6%,图片偏暗,对比度很低,因此完全看不清图片里边的内容。为了可以看清图片的内容,就必须对原始的灰度图片进行灰度拉伸,所谓灰度拉伸就是对图片灰度进行调整,将原始像素值重新映射到灰度级范围之内,从而改变图片的亮度和对比度。

图1 16位灰度图像以及其像素值分布

图1 16位灰度图像以及其像素值分布

2. 灰度图像线性拉伸

       如上文所说的那样,如果灰度图像的像素值分布在较小的范围,而灰度级又比较大,灰度级的利用率太低,势必会造成图像的对比度的严重下降。为了增加图像的对比度,就要想办法对像素值的分布进行调整,使得灰度级能得到充分的利用,一个最为简单的方法,就是采用线性拉伸,将小范围的像素分布,映射到整个灰度级范围。假如灰度图像的位深是16位,即期灰度级是65535,像素值范围是[12560,13584],为了调整对比度,可以将像素值重新映射到[0,65535]的范围之内。线性拉伸的计算公式如下所示:

I M G d s t = I M G s r c − M I N M A X − M I N × M IMG_{dst}=\frac{IMG_{src}-MIN}{MAX-MIN}\times M IMGdst=MAXMINIMGsrcMIN×M

上式中, I M G s r c IMG_{src} IMGsrc表示原始图片像素数据, I M G d s t IMG_{dst} IMGdst是经过线性拉伸后的像素值, M I N MIN MIN表示原始像素数据的最小值, M A X MAX MAX表示原始像素值数据的最大值, M M M表示灰度图像的灰度等级,一般是255、16383、65535,分别对应像素的位深8位、14位、16位。

       以下图2为一幅16位灰度图的,经过线性拉伸前后的视觉效果对比(左边位原始图,右边是经过线性拉伸的图)。通过对比图发现,经过线性拉伸后之后,图像从黑漆漆的一片,变成了可以看得见的图像,且其中的内容层次分明。
图2 线性拉伸效果

图2 线性拉伸效果

3. 灰度图像线性截断拉伸

       上文示例的图片,使用线性拉伸的算法进行处理,就可以取得良好的视觉效果,但是并非所有的图片都适用,只有那些像素值分布比较集中,且不存在少量像素值偏移均值太多的灰度图,才可以使用线性拉伸处理。如果灰度图像存在坏点,或者存在少数像素值偏离均值很多,导致像素值的分布范围很大,那么采用线性拉伸算法进行处理,视觉效果改善很小。上文提到,图像的对比度很低,是因为像素分布过于集中,灰度级利用率过低导致的。其实还有另一种情况,即使是像素利用率很高,但仍然视觉效果很差。导致这种结果的原因是,存在少量的像素点,其像素值散布很大,而这些少量的像素点,其实是“无效”的。也就是说,这些像素点由于数量很少,它们对于视觉的贡献是很小的,却占用了大量的灰度空间,而大量的像素值还拥挤在狭小的灰度空间内,实际上有效的灰度级利用率还是很小。比如一种比较极端的情况:一张16位的灰度图,其99.9%的像素值分布在[10000,15000]这样小的范围内,而有0.1%的像素是极暗的0值或者极亮的值65535,远远偏离了大部队的位置,如果采用上文通过求最大最小值的方法进行拉伸,最后图像的对比度不会有任何的改善。

       为了改进线性拉伸算法的缺陷,需要对上下偏离中心值很大的像素进行截断。换句话说,这些散布较大的像素值,数量很少,它们对于视觉的贡献是可有可无的,所以把它们截掉之后对视觉的影响可以忽略不记。如图3所示,是一张16位灰度图的像素值分布图(直方图),可以看到大部分像素分布在[a,b]之间,占比99.8%,而少量的点散布在[0,a]和[b,65535]之间,占比0.2%。只要将像素值从a点和b点截断,只将像素区间[a,b]映射到0到65535之间,即可获得很好的对比度提升。
图3 像素值分布

图3 像素值分布
       截断一些像素值肯定是有利于提高对比度的,那么如何确定截断点在哪里呢?也就是说,如何去确定图3所示的a点和b点?这里提出一种“一刀切”的做法,那就是无论像素值的分布如何,我们总是要让一部分像素值被截断,被截断的像素值所占的百分比是一个可配置的参数,也就说我们可以指定一个往下截断百分比和一个往上截断百分比,比如往下截断0.1%和往下截断0.1%,通过统计被截断像素所占的百分比,确定截断值a和b。假设,图片的总像素数量为num_pixels,灰度等级为M,上下截断的百分比为pcnt,那么确定截断值a和b的具体操作步骤如下:

(1)首先,统计灰度图片的直方图hist,hist为一个一维数组,直方图的数量即数组的长度跟灰度等级一致,如果灰度等级是255,则直方图数量为256,如果灰度等级是65535,则直方图数量为65536;

(2)其次,从下标i=0,1,2,…开始对直方图hist[0:i]进行累计求和得到累计直方图acc_hist,acc_hist=sum(hist[0:i]),当acc_hist/num_pixels>pcnt时,此时的索引值i就是下截止值a;继续对直方图进行累计,当acc_hist/num_pixels>1-pcnt时,此时的i就是上截止值b。

(3)获得上下截止值a和b之后,对原图的像素值进行截断,凡是像素值小于a的都截断为a,凡是像素值大于b的都截断为b。像素值截断之后,开始利用上文提到的线性拉伸方法对图片数据进行拉伸处理,其计算公式为:

I M G c l i p = c l i p ( I M G s r c ) , r a n g e ( a , b ) IMG_{clip}=clip(IMG_{src}), range(a,b) IMGclip=clip(IMGsrc),range(a,b)

I M G d s t = I M G c l i p − a b − a × M IMG_{dst}=\frac{IMG_{clip}-a}{b-a}\times M IMGdst=baIMGclipa×M

       下图4展示的灰度图使用线性拉伸算法以及使用线性截断拉伸算法处理的效果对比图。由此可知,线性截断拉伸算法的适应性更强,可以适应各种类型的灰度图像,特别是图像中存在坏点(盲元)的情况下,线性截断拉伸算法可以很好地剔除异常值,从而实现良好的对比度增强。

       本文所描述的线性截断拉伸算法实现代码如下:

       线性截断拉伸算法python代码

       线性截断拉伸算法matlab代码

图4 线性拉伸及线性截断拉伸效果对比

图4 线性拉伸及线性截断拉伸效果对比

4. 总结

       线性拉伸算法对于某些灰度图像,其对比度增强效果良好,但是适应性不强,如果图像中存在坏点或者存在少量像素值散布较大的情况,该方法失效。线性截断拉伸算法是线性拉伸算法的改进,可以克服线性拉伸算法的缺陷,具有剔除异常点的功能,适应性强,能较好地处理各种灰度图像。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555966.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​数据库原理及应用上机(实验六 视图的定义和维护)

✨作者:命运之光 ✨专栏:数据库原理及应用上机实验 ​ 目录 ✨一、实验目的和要求 ✨二、实验内容 ✨三、实验结果 ✨四.实验总结 🍓🍓前言: 数据库原理及应用上机实验报告的一个简单整理后期还会不断…

小白漂流记(如何自学网络安全?)

一、前言(关于我) 我算是“入行”不久的一个新人安全工作者,为什么是引号呢,因为我是个“半个野路子”出身。早在13年的时候,我在初中时期就已经在90sec、wooyun等社区一直学习、报告漏洞。后来由于升学的压力&#xf…

【Python入门篇】——Python中循环语句(for循环的嵌套应用)

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句…

普洱突围“春茶江湖”,抖音电商「春茶普洱季」解锁好茶生意新增量

“越沉越香”,是普洱茶鲜明的味道符号。国内普洱茶市场热自2000年左右兴起,并逐渐在春茶市场上占据重要的一席之地。为顺应春茶季节打造“普洱爆品”,实现生意的应季增长,抖音电商也为品牌商家提供了更为完善的营销与经营解法。 …

极米科技发布新一代光源技术,投影行业要变天?

作者:坚白 2018年以来,在年轻人群的追捧下,此前主要应用于商用场景的投影仪,逐渐切换到家用场景,而且随着投影技术的持续改进,投影效果也不断提升,家用投影市场进入高速发展期。 但进入2022年…

微信小程序组件设计规范分享

WeUI是一套与微信原生视觉体验一致的基本样式库。微信官方设计团队为微信网页和微信小程序量身定制设计,使用户感知更加统一,包括button、cell、dialog、progress、toast、article、actionsheet、微信weui开发团队可以直接使用icon等各种元素。下面资源社…

基于postman测试接口(整套接口测试)(附视频教程加源码)

目录 可以解决的问题 开启控制台 单个测试尝试 使用请求结果当参数 打印结果(JSON) 自定义可视化结果 随机参数 测试用例连接 一键测试接口集合 从swagger导入接口 自定义全局变量 可以解决的问题 几百个接口人工测试接口过于繁杂大多测试无法使用请求结果当参数可以…

(转载)从0开始学matlab(第12天)—选择语句(if、switch、try/catch)

选择结构可以使 MATLAB 选择性执行指定区域内的代码 ( 称之为语句块 blocks),而跳过其他区域的代码。选择结构在 MATLAB 中有三种具体的形式 :if 结构, switch 结构和try/catch 结构。 1 if 结构 1.1if语句的基本形式 if 结构的基本形式如下: 其…

菜鸡shader:L3三色环境光材质、阴影及光衰

三色环境光材质 先放上最终效果这里将环境光分为上中下三层,顶层是红色的,中间那层是绿色的,下层则是蓝色的。环境光遮蔽效果则是直接采样事先准备好的AO贴图。 首先是上层环境光: 这里我们只需要法线向量的第二个分量&#xf…

casbin基于RBAC模型实现权限管理

在casbin中权限都是基于匹配规则和访问控制模型实现的,除了上一章的ACL的实现方式,还有一个常用的访问控制模型RBAC。该模型带上了用户角色,基本满足大多数角色管理的系统。 在RBAC模型中多了一个角色的策略机制,其访问模型规则如…

消息中间件 - RabbitMQ篇之入门及进阶

这里写自定义目录标题 一. RabbitMQ简介1.1. 消息中间件1.1.1.什么是消息中间件1.1.2.消息中间件的传递模式1. 1.2.1 点对点1. 1.2.2 发布订阅模式 1.1.3 消息中间件种类1.1.4 消息中间件的作用 2. RabbitMQ介绍2.1.RabbitMQ的起源2.2.RabbitMQ的安装及简单使用 3. RabbitMQ的简…

Unity UI -- (6)增加Toggle和Slider

在前面的小节中,我们已经有了一个空的设置菜单。现在让我们来添加设置选项。 在本节最后,我们的设置菜单的样子参考如下: 添加一个音乐开关(Toggle) 现在让我们来增加一个toggle,让用户能够通过它来对场景的…

多功能语音芯片​NV040C的应用,为洗地机开辟新的应用领域

随着科技的快速发展,智能化和自动化已经成为了各个行业发展的主流趋势。传统的家庭洗拖工作日渐被各类洗地机、扫地机器人等取代,其中作为洗地机作为近几年家庭清洁的好物。近年来,不少洗地机厂商开始将语音芯片技术应用到产品中,…

多商户商城系统开发功能优势与选择技巧

电商行业的持续发展,让越来越多的商家企业开始选择入驻多商户商城,通过该系统不仅能够为消费者提供更加便捷良好的购物体验,而且也能够为企业提供一个高效稳定的电商平台,可以说是未来电商行业发展的重要趋势。那么多商户商城系统…

Milk -v 开发板烧录系统以及ssh连接

Milk -v 开发板烧录系统以及ssh连接 0. 前言1. 系统下载2. 驱动安装3. ssh连接 0. 前言 操作系统:Windows10 专业版 开发板:Milk -v 准备读卡器、内存卡、Typec 数据线 Milk-V开发板官方文档 到手后它的外形和宣传图片是一致的,但是更加的…

微信小程序云开发学习记录--1

目录 1.配置小程序项目 2. 云创建 3.新建云文件夹 4.数据库的建立和使用 5.增、删、改、查四种数据库基本操作 增加数据 查询数据 修改数据 删除数据 拿到微信小程序,首先可以先配置好自己的服务器或者是云环境,服务器的方法就不说了&#xff0…

前端实训——Day01

前言 学校最近开始实训周了,一上就是一个月,本来想在课上学点考研的东西的,但是无奈任务重,而且最后还能有点小奖励,就认真学了,再者说,html也挺重要的,学一学也不算浪费时间。 软…

Linux——安装tomcat并部署项目

目录 1、准备阶段 2、具体步骤 2.1、下载tomcat安装包 2.2、上传tomcat安装包 2.3、启动tomcat 2.4、访问页面 3、部署Maven项目至tomcat 3.1、打包Maven项目 3.2、上传打包后的war包至Linux 3.3、修改连接数据库配置文件中的ip 3.4、访问项目 3.5、直接访问ip访问…

Promise理解+ JS 的执行机制

做一道题,理解一下: function getPrinterList() {let res 初始setTimeout(() > {res 1},1000)return res }let res getPrinterList() console.log(res); //输出初始 在getPrinterList函数中,先分清同步异步. JS执行语句时,会区分同步异步,把所有的同步放在同步队列中,把…

【Python pymongo】零基础也能轻松掌握的学习路线与参考资料

Python pymongo是一款基于Python的MongoDB数据库的驱动程序,它提供了操作MongoDB数据库的接口和方法。学习Python pymongo可以帮助开发者更好地使用MongoDB数据库,从而实现更好的数据存储和管理。在这篇文章中,我们将介绍Python pymongo的学习…