『youcans 的 OpenCV 例程200篇 - 总目录』


【OpenCV 例程200篇】39. 图像灰度的线性变换


线性灰度变换将原始图像灰度值的动态范围按线性关系扩展到指定范围或整个动态范围。

线性灰度变化对图像的每一个像素作线性拉伸,可以凸显图像的细节,提高图像的对比度。

线性灰度变换可以由以下公式描述 :

D t = d − c b − a [ D − a ] + c = α D + β Dt = \frac{d-c}{b-a}[D-a]+c = \alpha D + \beta Dt=badc[Da]+c=αD+β
式中,D 为原始图像的灰度值,Dt 为线性灰度变换后的图像灰度值。

  • α = 1 , β = 0 \alpha = 1,\beta = 0 α=1β=0 时,保持原始图像不变
  • α = 1 , β > 0 \alpha = 1,\beta > 0 α=1β>0 时,图像的灰度值上移,灰度图像颜色发白(彩色图像颜色发亮)
  • α = 1 , β < 0 \alpha = 1,\beta < 0 α=1β<0 时,图像的灰度值下移,灰度图像颜色发黑(彩色图像颜色发暗)
  • α > 1 \alpha>1 α>1 时,图像的对比度增强
  • 0 < α < 1 0 < \alpha < 1 0<α<1 时,图像的对比度减小
  • α < 0 , β = 255 \alpha < 0,\beta=255 α<0β=255 时,图像暗区域变亮,亮区域变暗,图像求补
  • α = − 1 , β = 255 \alpha = -1,\beta = 255 α=1β=255 时,图像的灰度值反转

直方图正规化是根据图像的最小灰度级和最大灰度级,将其拉伸到灰度级全域 [0,255] 的线性变换。


例程:1.49 图像的线性灰度变换

    # 1.49 图像的线性灰度变换
    img = cv2.imread("../images/imgLena.tif")  # 读取彩色图像(BGR)
    imgGray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 颜色转换:BGR(OpenCV) -> Gray
    h, w = img.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):
            img1[i][j] = min(255, max((imgGray[i][j]+beta1), 0))  # alfa=1,beta>0: 颜色发白
            img2[i][j] = min(255, max((imgGray[i][j]+beta2), 0))  # alfa=1,beta<0: 颜色发黑
            img3[i][j] = min(255, max(alfa3*imgGray[i][j], 0))  # alfa>1,beta=0: 对比度增强
            img4[i][j] = min(255, max(alfa4*imgGray[i][j], 0))  # 0<alfa<1,beta=0: 对比度减小
            img5[i][j] = alfa5*imgGray[i][j]+beta5  # alfa<0,beta=255: 暗区域变亮,亮区域变暗
            img6[i][j] = min(255, max(alfa6*imgGray[i][j]+beta6, 0))  # alfa=-1,beta=255: 灰度值反转

    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"]
    imageList = [imgGray, img1, img2, img3, img4, img5]
    for i in range(6):
        plt.subplot(2, 3, i + 1), plt.title(titleList[i]), plt.axis('off')
        plt.imshow(imageList[i], vmin=0, vmax=255, cmap='gray')
    plt.show()

在这里插入图片描述


(本节完)


版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125112487)
Copyright 2022 youcans, XUPT
Crated:2021-11-18

【第4章:灰度变换与直方图】

37. 图像的灰度化处理和二值化处理
39. 图像灰度的线性变换

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐