Python图像灰度线性变换详解:上移、对比度调整与反色算法
本文详细解析Python中使用OpenCV进行图像灰度线性变换的方法。通过调整线性方程参数α和b,实现图像灰度上移、对比度增强与减弱以及灰度反色。文章结合具体公式与Python代码示例,演示如何处理像素溢出及实现不同视觉效果,适用于图像预处理与医学图像处理场景。
一、灰度线性变换概述
图像灰度线性变换的核心在于构建灰度映射关系,以此调整原始图像的灰度分布。这一过程旨在优化图像质量,凸显细节特征,并有效提高图像的对比度。其数学表达如公式(12-1)所示:

在该公式中,DB代表变换后的输出灰度值,DA代表输入图像的原始灰度值。参数α和b分别对应线性变换方程f(D)的斜率和截距[1-4]。
- 若设定α=1且b=0,图像保持原始状态不变。
- 若设定α=1且b≠0,图像所有像素的灰度值将整体向上或向下平移。
- 若设定α=-1且b=255,则实现原始图像灰度值的反转(求补)。
- 当α>1时,输出图像的对比度得到增强。
- 当0<α<1时,输出图像的对比度降低。
- 当α<0时,原始图像中的暗区域会变亮,亮区域变暗,实现图像求补效果。
如图12-1所示,展示了上述灰度线性变换对应的视觉效果。

二、图像灰度上移变换实现
该算法旨在通过提升图像灰度值来增加整体亮度。
变换公式为:DB=DA+50。
具体Python实现代码如下。由于图像灰度值的有效区间为0至255,代码中必须包含溢出判断逻辑以防止数值越界。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('luo.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
#创建一幅图像
result = np.zeros((height, width), np.uint8)
#图像灰度上移变换 DB=DA+50
for i in range(height):
for j in range(width):
if (int(grayImage[i,j]+50) > 255):
gray = 255
else:
gray = int(grayImage[i,j]+50)
result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如图12-2所示,所有灰度值上移50后,图像整体变得更亮。需注意,纯黑色对应灰度值0,纯白色对应灰度值255。

三、图像对比度增强变换实现
该算法用于增强图像的对比度,Python实现代码如下:
变换公式为:DB=DA×1.5。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('luo.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
#创建一幅图像
result = np.zeros((height, width), np.uint8)
#图像对比度增强变换 DB=DA×1.5
for i in range(height):
for j in range(width):
if (int(grayImage[i,j]*1.5) > 255):
gray = 255
else:
gray = int(grayImage[i,j]*1.5)
result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
输出结果如图12-3所示,图像灰度值增强1.5倍,细节更加清晰。

四、图像对比度减弱变换实现
该算法用于降低图像的对比度,Python实现代码如下:
变换公式为:DB=DA×0.8。
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('luo.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
#创建一幅图像
result = np.zeros((height, width), np.uint8)
#图像对比度减弱变换 DB=DA×0.8
for i in range(height):
for j in range(width):
gray = int(grayImage[i,j]*0.8)
result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如图12-4所示,图像灰度值减弱,整体色调变暗。

五、图像灰度反色变换实现
灰度反色变换,亦称线性灰度求补变换,是对原图像像素值进行反转的过程,即将黑色转换为白色,白色转换为黑色。
变换公式为:DB=255-DA。
其Python实现代码如下:
# -*- coding: utf-8 -*-
# By:Eastmount
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('luo.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
#创建一幅图像
result = np.zeros((height, width), np.uint8)
#图像灰度反色变换 DB=255-DA
for i in range(height):
for j in range(width):
gray = 255 - grayImage[i,j]
result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果如图12-5所示,处理前后的图像灰度值呈现互补关系。

图像灰度反色变换在医学图像处理领域具有特定应用价值,如图12-6所示:

六、总结
本文主要讲解了图像灰度线性变换,涵盖了图像灰度上移、对比度增强、对比度减弱以及灰度反色四种变换方式。建议读者动手实现文中的代码,以切实提升编程与图像处理能力。
到此这篇关于Python图像运算之图像灰度线性变换详解的文章就介绍到这了,更多相关Python图像灰度线性变换内容请搜索本站以前的文章或继续浏览下面的相关文章,希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













