失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Python 图像处理实战 | 图像的灰度非线性变换之对数变换 伽马变换

Python 图像处理实战 | 图像的灰度非线性变换之对数变换 伽马变换

时间:2023-03-23 01:00:20

相关推荐

Python 图像处理实战 | 图像的灰度非线性变换之对数变换 伽马变换

作者 | 杨秀璋

来源 | CSDN博客

责编 | 夕颜

头图 | 付费下载自视觉中国

出品 | CSDN(ID:CSDNnews)

本篇文章主要讲解非线性变换,使用自定义方法对图像进行灰度化处理,包括对数变换和伽马变换。本文主要讲解灰度线性变换,基础性知识希望对你有所帮助。

1.图像灰度非线性变换:DB=DA×DA/255

2.图像灰度对数变换

3.图像灰度伽玛变换

图像灰度非线性变换:DB=DA×DA/255

图像的灰度非线性变换主要包括对数变换、幂次变换、指数变换、分段函数变换,通过非线性关系对图像进行灰度处理,下面主要讲解三种常见类型的灰度非线性变换。

原始图像的灰度值按照DB=DA×DA/255的公式进行非线性变换,其代码如下:

1#-*-coding:utf-8-*-2importcv23importnumpyasnp4importmatplotlib.pyplotasplt56#读取原始图像7img=cv2.imread('miao.png')89#图像灰度转换10grayImage=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)1112#获取图像高度和宽度13height=grayImage.shape[0]14width=grayImage.shape[1]1516#创建一幅图像17result=np.zeros((height,width),np.uint8)1819#图像灰度非线性变换:DB=DA×DA/25520foriinrange(height):21forjinrange(width):22gray=int(grayImage[i,j])*int(grayImage[i,j])/25523result[i,j]=np.uint8(gray)2425#显示图像26cv2.imshow("GrayImage",grayImage)27cv2.imshow("Result",result)2829#等待显示30cv2.waitKey(0)31cv2.destroyAllWindows()

图像灰度非线性变换的输出结果下图所示:

图像灰度对数变换

图像灰度的对数变换一般表示如公式所示:

其中c为尺度比较常数,DA为原始图像灰度值,DB为变换后的目标灰度值。如下图所示,它表示对数曲线下的灰度值变化情况。

由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升。这种变换可用于增强图像的暗部细节,从而用来扩展被压缩的高值图像中的较暗像素。

对数变换实现了扩展低灰度值而压缩高灰度值的效果,被广泛地应用于频谱图像的显示中。一个典型的应用是傅立叶频谱,其动态范围可能宽达0~106直接显示频谱时,图像显示设备的动态范围往往不能满足要求,从而丢失大量的暗部细节;而在使用对数变换之后,图像的动态范围被合理地非线性压缩,从而可以清晰地显示。在下图中,未经变换的频谱经过对数变换后,增加了低灰度区域的对比度,从而增强暗部的细节。

下面的代码实现了图像灰度的对数变换。

1#-*-coding:utf-8-*-2importnumpyasnp3importmatplotlib.pyplotasplt4importcv256#绘制曲线7deflog_plot(c):8x=np.arange(0,256,0.01)9y=c*np.log(1+x)10plt.plot(x,y,'r',linewidth=1)11plt.rcParams['font.sans-serif']=['SimHei']#正常显示中文标签12plt.title(u'对数变换函数')13plt.xlim(0,255),plt.ylim(0,255)14plt.show()1516#对数变换17deflog(c,img):18output=c*np.log(1.0+img)19output=np.uint8(output+0.5)20returnoutput2122#读取原始图像23img=cv2.imread('test.png')2425#绘制对数变换曲线26log_plot(42)2728#图像灰度对数变换29output=log(42,img)3031#显示图像32cv2.imshow('Input',img)33cv2.imshow('Output',output)34cv2.waitKey(0)35cv2.destroyAllWindows()

下图表示经过对数函数处理后的效果图,对数变换对于整体对比度偏低并且灰度值偏低的图像增强效果较好。

对应的对数函数曲线如图

图像灰度伽玛变换

伽玛变换又称为指数变换或幂次变换,是另一种常用的灰度非线性变换。图像灰度的伽玛变换一般表示如公式所示:

当γ>1时,会拉伸图像中灰度级较高的区域,压缩灰度级较低的部分。

当γ<1时,会拉伸图像中灰度级较低的区域,压缩灰度级较高的部分。

当γ=1时,该灰度变换是线性的,此时通过线性方式改变原图像。

Python实现图像灰度的伽玛变换代码如下,主要调用幂函数实现。

1#-*-coding:utf-8-*-2importnumpyasnp3importmatplotlib.pyplotasplt4importcv256#绘制曲线7defgamma_plot(c,v):8x=np.arange(0,256,0.01)9y=c*x**v10plt.plot(x,y,'r',linewidth=1)11plt.rcParams['font.sans-serif']=['SimHei']#正常显示中文标签12plt.title(u'伽马变换函数')13plt.xlim([0,255]),plt.ylim([0,255])14plt.show()1516#伽玛变换17defgamma(img,c,v):18lut=np.zeros(256,dtype=np.float32)19foriinrange(256):20lut[i]=c*i**v21output_img=cv2.LUT(img,lut)#像素灰度值的映射22output_img=np.uint8(output_img+0.5)23returnoutput_img2425#读取原始图像26img=cv2.imread('test.png')2728#绘制伽玛变换曲线29gamma_plot(0.00000005,4.0)3031#图像灰度伽玛变换32output=gamma(img,0.00000005,4.0)3334#显示图像35cv2.imshow('Imput',img)36cv2.imshow('Output',output)37cv2.waitKey(0)38cv2.destroyAllWindows()

下图表示经过伽玛变换处理后的效果图,伽马变换对于图像对比度偏低,并且整体亮度值偏高(或由于相机过曝)情况下的图像增强效果明显。

对应的幂律函数曲线如图所示。

文章周日写于钟书阁,女神伴于旁。希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。

原文链接:

/Eastmount/article/details/88929290

【End】

推荐阅读

☞苹果或已放弃3月发布廉价新iPhone;贾跃亭回应家人巨额索赔;微软不再继续开发 Visual Basic | 极客头条

☞75.58 亿美元成交!美国最大规模 5G 毫米波频谱拍卖

☞超轻量级中文OCR,支持竖排文字识别、ncnn推理,总模型仅17M

☞和黑客斗争的 6 天!

☞一文了解 Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控!

☞用 3 个“鸽子”,告诉你闪电网络是怎样改变加密消息传递方式的!

你点的每一个在看,我认真当成了喜欢

如果觉得《Python 图像处理实战 | 图像的灰度非线性变换之对数变换 伽马变换》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。