图像的线性变换

  图像的线性变换是一种基本的像素值变换方法,它可以通过线性函数对图像中的每个像素值进行映射。这种变换通常用于调整图像的对比度和亮度,以及进行灰度级的拉伸或压缩。线性变换可以表示为以下数学公式:
  对于输入图像 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):
                    #将像素值限制在0255的范围内
                    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()
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Make_magic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值