图像的线性变换是一种基本的像素值变换方法,它可以通过线性函数对图像中的每个像素值进行映射。这种变换通常用于调整图像的对比度和亮度,以及进行灰度级的拉伸或压缩。线性变换可以表示为以下数学公式:
对于输入图像
I
I
I,经过线性变换后的输出图像
O
O
O,映射关系可以用如下的线性函数表示:
O
(
x
,
y
)
=
α
⋅
I
(
x
,
y
)
+
β
O(x, y) = \alpha \cdot I(x, y) + \beta
O(x,y)=α⋅I(x,y)+β
其中,
O
(
x
,
y
)
O(x, y)
O(x,y) 是输出图像在坐标
(
x
,
y
)
(x, y)
(x,y) 处的像素值;
I
(
x
,
y
)
I(x, y)
I(x,y) 是输入图像在坐标
(
x
,
y
)
(x, y)
(x,y) 处的像素值;
α
\alpha
α 是缩放系数,用于调整图像对比度;
β
\beta
β 是平移系数,用于调整图像亮度。
这个公式中的线性变换将输入图像的每个像素值按比例缩放,并且可以通过平移调整整个像素值范围的位置。当
α
>
1
\alpha > 1
α>1 时,像素值会被放大,增加图像对比度;当
0
<
α
<
1
0 < \alpha < 1
0<α<1 时,像素值会被缩小,降低图像对比度。而
β
\beta
β 控制整个像素值的平移,即调整图像的亮度。
作用和使用场景:
线性变换在图像处理中有许多应用,其中包括但不限于以下几个方面:
1. 调整对比度和亮度: 通过调整
α
\alpha
α 和
β
\beta
β 可以增加或降低图像的对比度和亮度,从而使图像更清晰、更鲜艳或更暗淡。
2. 灰度级拉伸: 灰度级拉伸是一种常见的图像增强方法,可以通过线性变换将图像的灰度级范围拉伸到整个像素值范围,从而增强图像的视觉效果。
3. 直方图均衡化: 直方图均衡化也是一种常见的图像增强技术,通过线性变换使图像的直方图在灰度级上更均匀分布,提高图像的对比度。
4. 伽马校正: 伽马校正是一种非线性变换,但也可以通过线性变换来近似实现,用于校正图像的亮度非线性问题。
5. 图像融合: 在图像融合中,线性变换可以用于调整多幅图像的对比度和亮度,使得融合后的图像更自然和平滑。
总之,线性变换是图像处理中一种简单而有效的像素值映射方法,它在图像增强、对比度调整、亮度调整等方面有广泛的应用。通过调整公式中的参数,可以实现不同的图像处理效果,满足不同场景下的需求。
代码实现过程如下所示:
import cv2
import numpy as np
import matplotlib.pyplot as plt
class Linear:
def __init__(self,input_path):
self.input_path=input_path
def linear_change(self):
img=cv2.imread(self.input_path)
if img is None:
print("Unable to load image!")
else:
imgGray=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
h,w=imgGray.shape[:2]
img1=np.empty((h,w),np.uint8)#创建空白数组
img2 = np.empty((h, w), np.uint8) # 创建空白数组
img3 = np.empty((h, w), np.uint8) # 创建空白数组
img4 = np.empty((h, w), np.uint8) # 创建空白数组
img5 = np.empty((h, w), np.uint8) # 创建空白数组
img6 = np.empty((h, w), np.uint8) # 创建空白数组
# Dt[i,j] = alfa*D[i,j] + beta
alfa1, beta1 = 1, 50 # alfa=1,beta>0: 灰度值上移
alfa2, beta2 = 1, -50 # alfa=1,beta<0: 灰度值下移
alfa3, beta3 = 1.5, 0 # alfa>1,beta=0: 对比度增强
alfa4, beta4 = 0.75, 0 # 0<alfa<1,beta=0: 对比度减小
alfa5, beta5 = -0.5, 0 # alfa<0,beta=0: 暗区域变亮,亮区域变暗
alfa6, beta6 = -1, 255 # alfa=-1,beta=255: 灰度值反转
for i in range(h):
for j in range(w):
#将像素值限制在0到255的范围内
img1[i][j] = min(255, max((alfa1*imgGray[i][j]+beta1), 0)) # alfa=1,beta>0: 颜色发白
img2[i][j] = min(255, max((alfa2 * imgGray[i][j] + beta2), 0))
img3[i][j] = min(255, max((alfa3 * imgGray[i][j] + beta3), 0))
img4[i][j] = min(255, max((alfa4 * imgGray[i][j] + beta4), 0))
img5[i][j] = alfa5 * imgGray[i][j] + beta5
img6[i][j] = min(255, max((alfa6 * imgGray[i][j] + beta6), 0))
self.img_show(imgGray, img1, img2, img3, img4, img5,img6)
def img_show(self,imgGray,img1, img2, img3, img4, img5,img7):
plt.figure(figsize=(10, 6))
titleList = ["1. imgGray", "2. beta=50", "3. beta=-50", "4. alfa=1.5", "5. alfa=0.75", "6. alfa=-0.5","7. alfa=-1"]
imageList = [imgGray, img1, img2, img3, img4, img5,img7]
for i in range(7):
plt.subplot(2, 4, i + 1), plt.title(titleList[i]), plt.axis('off')
plt.imshow(imageList[i], vmin=0, vmax=255, cmap='gray')
plt.show()
# 图像文件路径
imgfile = "./Images/lena.jpg"
img_change=Linear(imgfile)
img_change.linear_change()