数字图像处理: 亮度调整

数字图像处理 专栏收录该内容
23 篇文章 1 订阅

 

 图像亮度、对比度、饱和度和锐化之间并不是彼此独立的,改变其中一个特征可能会同时引起图像其他特征的变化,至于变化的程度取决于图像本身的特性,先建立一个概念,在后面的会在详述

 

1、亮度基本概念


图像亮度通俗理解便是图像的明暗程度,数字图像 f(x,y) = i(x,y) r(x, y) ,如果灰度值在[0,255]之间,则 f 值越接近0亮度越低,f 值越接近255亮度越高。而且我们也要把亮度和对比度区分开来,正如上述提的对比度指的是最高和最低灰度级之间的灰度差。下面通过图片感受一下亮度变化对数字图像的影响:

å¨è¿éæå¥å¾çæè¿°
上面白色和红色两幅图中,图的右边相对于左边增加了亮度,可以看出图像右边相对于左边亮度有了一个整体的提升,这里只是对亮度做了一个小弧度的提升,我们尝试着将亮度提升的更高,如下图:

å¨è¿éæå¥å¾çæè¿°
这里需要强调的是如果我们对亮度做这么一个剧烈的改变,那么便会在改变图片强度的同时也影响了图片的饱和度、对比度和清晰度,此时两个图片右边部分饱和度、对比度和清晰度都降低了,原因是过度增加亮度导致阴影赶上了高光,因为最大灰度值是固定的,所以最低灰度值快赶上了最大灰度值,因此影响了图片的饱和度、对比度和清晰度

2、图像亮度调节示例

  • 图像对比度调节可以直接在RGB空间利用变换公式 g(i,j)= af(i,j) + b 对图像进行线性变化;

对于数字图像变换,设原像素灰度为 f(i,j),转化后的像素灰度为 g(i,j),则常用的线性变换是 g(i,j)= af(i,j) + b, 其中系数 a 影响图像的对比度,系数 b 影响图像的亮度,具体如下:
(1) a=1时是原图;
(2) a>1时对比度增强,图像看起来更加清晰;
(3) a<1时对比度减弱,图像看起来变暗;
(4) b影响图像的亮度,随着增加b (b>0)和减小b (b>0),图像整体的灰度值上移或者下移, 也就是图像整体变亮或者变暗, 不会改变图像的对比度


代码:

import cv2
import imutils
import numpy as np

def c_and_b(arg):
    ''''''
    contrast_num = cv2.getTrackbarPos(trackbar_name1, wname)
    brightness_num = cv2.getTrackbarPos(trackbar_name2, wname)
    #print(bnum)
    cimg = np.ones((img.shape[0], img.shape[1], 3), dtype=np.uint8)
    for i in range(img.shape[0]):
        for j in range(img.shape[1]):
            lst = 0.1 * contrast_num * img[i, j] + brightness_num
            cimg[i, j] = [int(ele) if ele < 255 else 255 for ele in lst]

    cv2.imshow(wname, imutils.resize(cimg, 800))


wname = 'brightness and contrast'
trackbar_name1 = 'contrast'
trackbar_name2 = 'brightness'
img = cv2.imread(r"E:\yun_project\face_morpher\bieber.jpg")
height, width = img.shape[:2]
img = cv2.resize(img, (int(width/height*400), 400), interpolation=cv2.INTER_CUBIC)

cv2.namedWindow(wname)
cv2.createTrackbar(trackbar_name1, wname, 10, 20, c_and_b)
cv2.createTrackbar(trackbar_name2, wname, 0, 100, c_and_b)

c_and_b(0)

if cv2.waitKey(1) & 0xFF == ord('q'):
    cv2.destroyAllWindows()

 

效果:

 

那么对于两张图像融合时,图像的色调不同, 可以通过调整三色通道,达到调节图像亮度的目的

# 计算指定不规则图像中的平均亮度
def calculate_average_brightness(img):
    # 三色通道的平均值
    B = img[..., 0].mean()
    G = img[..., 1].mean()
    R = img[..., 2].mean()

    # 显示亮度
    brightness = 0.299 * R + 0.587 * G + 0.114 * B
    return brightness, B, G, R

# 计算图像平均亮度调节图像
# 将目标图像的平均亮度调整为源图像的平均亮度
def adjust_brightness_from_src_to_dst(src, dst):
    brightness1, B1, G1, R1 = calculate_average_brightness(src)
    brightness2, B2, G2, R2 = calculate_average_brightness(dst)
    brightness_difference = int(round(brightness1 - brightness2))

    print('原图的平均亮度', brightness1)
    print('目标的平均亮度', brightness2)
    print('原图与目标的亮度差距', brightness_difference)


    # 按照平均显示亮度进行增强
    dstf = dst + brightness_difference

    # 按照三色通道平均值进行增强
    # dstf = dst.copy().astype(np.float32)
    # dstf[..., 0] = dst[..., 0] + (B1 - B2)
    # dstf[..., 1] = dst[..., 1] + (G1 - G2)
    # dstf[..., 2] = dst[..., 2] + (R1 - R2)

    # 对结果进行限制,放置越界,必须转成uint8,不然结果默认为float32,会出错
    dstf = np.clip(dstf, 0, 255)
    dstf = np.uint8(dstf)
    return dstf

按照平均显示亮度进行增强的效果图

按照三色通道平均值进行增强的效果图

推荐文章

https://blog.csdn.net/feilong_csdn/article/details/82755816

https://www.cnblogs.com/skiwnchiwns/p/10130833.html

 

  • 3
    点赞
  • 0
    评论
  • 24
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值