python将图像转化为灰度图像,灰度图像线性变换非线性变换
本文将详细说明图像灰度的非线性变换。图像灰度的非线性变换主要包括对数变换、幂变换、指数变换和分段函数变换。通过非线性关系对图像进行处理。主要讲解三种常见的灰度非线性变换,有兴趣的可以看看。
00-1010 1.灰度2的图像非线性变换。图像灰度对数变换3。图像灰度伽马变换4。摘要
目录
原始图像的灰度值按照公式DB=DADA/255进行非线性变换,其代码如下:
# -*-编码: utf-8 -*-
# By:伊斯特蒙特
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#阅读原文图片
img=cv2.imread(luo.png )
#图像灰度转换
grayImage=cv2.cvtColor(img,cv2。COLOR_BGR2GRAY)
#获取图像的高度和宽度
height=grayImage.shape[0]
width=grayImage.shape[1]
#创建图像
result=np.zeros((高度,宽度),np.uint8)
#图像灰度的非线性变换:DB=DADA/255
对于在范围(高度):的I
对于范围(宽度):内的j
gray=int(grayImage[i,j])*int(grayImage[i,j])/255
结果[i,j]=np.uint8(灰色)
#显示图像
cv2.imshow(灰度图像,灰度图像)
cv2.imshow(Result ,结果)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
灰度图像非线性变换的输出结果如图13-1所示:
一.图像灰度非线性变换
图像灰度的对数变换通常如公式(13-1)所示:
其中C是比例比较常数,DA是原始图像灰度值,DB是变换后的目标灰度值。如图13-2所示,是对数曲线下灰度值的变化,其中X代表原始图像的灰度值,Y代表对数变换后的目标灰度值。
因为对数曲线在像素值低的区域斜率大,在像素值高的区域斜率小,所以图像对数变换后暗区的对比度会有所提高。这种变换可以用来增强图像的暗细节,从而扩展压缩后的高值图像中的暗像素。
对数变换达到扩展低灰度值和压缩高灰度值的效果,广泛应用于光谱图像的显示。典型的应用是傅里叶频谱,其动态范围可能宽至0 ~ 106。直接显示光谱时,图像显示设备的动态范围往往达不到要求,从而丢失了很多暗部细节。但经过对数变换后,图像的动态范围被非线性压缩,从而可以清晰显示。
在图13-3中,对数变换后,未变换的光谱增加了低灰度区的对比度,从而增强了暗部的细节。
下面的代码实现了图像灰度的对数变换。
# -*-编码: utf-8 -*-
# By:伊斯特蒙特
将numpy作为np导入
将matplotlib.pyplot作为plt导入
导入cv2
#画一条曲线
def log_plot(c):
x=np.arange(0,256,0.01)
y=c * np.log(1 x)
plt.plot(x,y, r ,线宽=1)
PLT . RC params[ font . sans-serif ]=[ sim hei ]#中文标签正常显示。
Plt.title(对数变换函数)
plt.xlabel(x )
plt.ylabel(y )
plt.xlim(0,255),plt.ylim(0,255)
plt.show()
#对数变换
定义日志(c,img):
输出=c * np.log(1.0 img)
输出=np.uint8(输出0.5)
归零
n output
#读取原始图像
img = cv2.imread(dark.png)
#绘制对数变换曲线
log_plot(42)
#图像灰度对数变换
output = log(42, img)
#显示图像
cv2.imshow(Input, img)
cv2.imshow(Output, output)
cv2.waitKey(0)
cv2.destroyAllWindows()
图13-4表示经过对数函数处理后的效果图,对数变换对于整体对比度偏低并且灰度值偏低的图像增强效果较好。
对应的对数函数曲线如图13-5所示,其中x表示原始图像的灰度值,y表示对数变换之后的目标灰度值。
三.图像灰度伽玛变换
伽玛变换又称为指数变换或幂次变换,是另一种常用的灰度非线性变换。图像灰度的伽玛变换一般表示如公式(13-2)所示:
当γ>1时,会拉伸图像中灰度级较高的区域,压缩灰度级较低的部分。
当γ<1时,会拉伸图像中灰度级较低的区域,压缩灰度级较高的部分。
当γ=1时,该灰度变换是线性的,此时通过线性方式改变原图像。
Python实现图像灰度的伽玛变换代码如下,主要调用幂函数实现。
# -*- coding: utf-8 -*-# By:Eastmount
import numpy as np
import matplotlib.pyplot as plt
import cv2
#绘制曲线
def gamma_plot(c, v):
x = np.arange(0, 256, 0.01)
y = c*x**v
plt.plot(x, y, r, linewidth=1)
plt.rcParams[font.sans-serif]=[SimHei] #正常显示中文标签
plt.title(伽马变换函数)
plt.xlabel(x)
plt.ylabel(y)
plt.xlim([0, 255]), plt.ylim([0, 255])
plt.show()
#伽玛变换
def gamma(img, c, v):
lut = np.zeros(256, dtype=np.float32)
for i in range(256):
lut[i] = c * i ** v
output_img = cv2.LUT(img, lut) #像素灰度值的映射
output_img = np.uint8(output_img+0.5)
return output_img
#读取原始图像
img = cv2.imread(white.png)
#绘制伽玛变换曲线
gamma_plot(0.00000005, 4.0)
#图像灰度伽玛变换
output = gamma(img, 0.00000005, 4.0)
#显示图像
cv2.imshow(Imput, img)
cv2.imshow(Output, output)
cv2.waitKey(0)
cv2.destroyAllWindows()
图13-6表示经过伽玛变换处理后的效果图,伽马变换对于图像对比度偏低,并且整体亮度值偏高(或由于相机过曝)情况下的图像增强效果明显。
对应的伽马变换曲线如图13-7所示,其中x表示原始图像的灰度值,y表示伽马变换之后的目标灰度值。
四.总结
本文主要讲解图像灰度非线性变换,包括图像对数变换和伽马变换。其中,图像经过对数变换后,较暗区域的对比度将有所提升;而案例中经过伽玛变换处理的图像,整体亮度值偏高(或由于相机过曝)情况下的图像增强效果明显。这些图像处理方法能有效提升图像的质量,为我们提供更好地感官效果。
到此这篇关于Python图像运算之图像灰度非线性变换详解的文章就介绍到这了,更多相关Python图像灰度变换内容请搜索盛行IT软件开发工作室以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。