opencv-python 图像灰度变换

系统 1397 0

  灰度变换作为一种图像预处理技术可以显著的改善图像的质量,下面将介绍几种灰度变换的方法

1. gamma 变换

  Gamma变换是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系:

s = c r λ s = cr^{\lambda} s = c r λ

这个指数即为Gamma。

Gamma变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正。

经过Gamma变换后的输入和输出图像灰度值关系如图1所示:横坐标是输入灰度值,纵坐标是输出灰度值,蓝色曲线是gamma值小于1时的输入输出关系,红色曲线是gamma值大于1时的输入输出关系。可以观察到, 当gamma值小于1时(蓝色曲线),图像的整体亮度值得到提升,同时低灰度处的对比度得到增加,更利于分辩低灰度值时的图像细节。

1.1 实现代码

  下面是就 python2.7 和 opencv 的实现

            
              
                def
              
              
                gamma_trans
              
              
                (
              
              img
              
                ,
              
              gamma
              
                )
              
              
                :
              
              
                #具体做法先归一化到1,然后gamma作为指数值求出新的像素值再还原
              
              
	gamma_table 
              
                =
              
              
                [
              
              np
              
                .
              
              power
              
                (
              
              x
              
                /
              
              
                255.0
              
              
                ,
              
              gamma
              
                )
              
              
                *
              
              
                255.0
              
              
                for
              
               x 
              
                in
              
              
                range
              
              
                (
              
              
                256
              
              
                )
              
              
                ]
              
              
	gamma_table 
              
                =
              
               np
              
                .
              
              
                round
              
              
                (
              
              np
              
                .
              
              array
              
                (
              
              gamma_table
              
                )
              
              
                )
              
              
                .
              
              astype
              
                (
              
              np
              
                .
              
              uint8
              
                )
              
              
                #实现映射用的是Opencv的查表函数
              
              
                return
              
               cv2
              
                .
              
              LUT
              
                (
              
              img0
              
                ,
              
              gamma_table
              
                )
              
            
          

在上面我们看到没有每次都计算一次指数,因为指数的计算复杂度很高,这里我们存储下计算结果,然后使用查表的方法来节省计算时间。但是上面这段代码还可以继续优化,因为每调用一次这个函数就要计算一遍需要查询的表格,当参数 λ \lambda λ 不变的时候,我们可以先计算出需要查的表,然后对每一张图像查表即可。

参考

[1] CSDN 京局京段蓝白猪《Python-OpenCV中的Gamma变换(校正)》

            
              s

            
          

更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论