需求场景
现有一灰度图像,需求是为该图像增加亮度。
原始灰度图像

预期目标图像

解决方案
不建议的方案——“+”运算符
假设我们需要为原始灰度图像的亮度整体提升88,那么利用“+”运算符的源码如下:
import cv2
img_path = r"D:\pycharmproject\python_project\lena.jpg"
img = cv2.imread(img_path, 0) # 以灰度图像格式读取图像
l_value = 88 # 欲增加的亮度值
img = img + l_value # 利用“+”运算符进行亮度增强操作
cv2.imshow('lena', img)
cv2.waitKey(0)
运行结果

 从结果可以看出,某些区域的亮度比【增强亮度前】更低
原因分析
由于cv2.imread()函数读取图像的数据格式是无符号8位整数(uint8),所以其数值范围是[0,255]。当应用“+”号运算符为原图增强亮度时,“+”的运算逻辑如下:
  
      
       
        
         
          
          
           
           
             a 
            
           
             + 
            
           
             b 
            
           
             = 
            
            
            
              { 
             
             
              
               
                
                 
                 
                   a 
                  
                 
                   + 
                  
                 
                   b 
                  
                 
                   , 
                  
                  
                 
                   a 
                  
                 
                   + 
                  
                 
                   b 
                  
                 
                   ≤ 
                  
                 
                   255 
                  
                 
                
               
              
              
               
                
                 
                 
                   m 
                  
                 
                   o 
                  
                 
                   d 
                  
                 
                   ( 
                  
                 
                   a 
                  
                 
                   + 
                  
                 
                   b 
                  
                 
                   , 
                  
                 
                   256 
                  
                 
                   ) 
                  
                 
                   , 
                  
                  
                 
                   a 
                  
                 
                   + 
                  
                 
                   b 
                  
                 
                   > 
                  
                 
                   255 
                  
                 
                
               
              
             
            
           
          
          
          
          
            (1) 
           
          
         
        
       
         a + b= \begin{cases} a+b,\quad a+b\leq 255\\ mod(a+b, 256), \quad a+b>255 \end{cases} \tag{1} 
        
       
     a+b={a+b,a+b≤255mod(a+b,256),a+b>255(1)
 即如果原图某个像素值a=200,而欲增强的亮度值为b=88,则“+"的运算结果并不是a + b = 288, 而是288 % 256 = 32(可以利用a的数据格式是uint8的信息协助理解)
建议的方案——cv2.add()方法
源码如下:
import cv2
img_path = r"D:\pycharmproject\python_project\lena.jpg"
img = cv2.imread(img_path, 0) # 以灰度图像格式读取图像
l_value = 88 # 欲增加的亮度值
img = cv2.add(img, l_value) # 利用cv2.add()方法进行亮度增强操作
cv2.imshow('lena', img)
cv2.waitKey(0)
运行结果

 从结果来看,没有出现某些区域的亮度比【增强亮度前】更低的现象。
结果分析
当应用cv2.add()方法为原图增强亮度时,其运算逻辑如下:
  
      
       
        
         
          
          
           
           
             a 
            
           
             + 
            
           
             b 
            
           
             = 
            
            
            
              { 
             
             
              
               
                
                 
                 
                   a 
                  
                 
                   + 
                  
                 
                   b 
                  
                 
                   , 
                  
                  
                 
                   a 
                  
                 
                   + 
                  
                 
                   b 
                  
                 
                   ≤ 
                  
                 
                   255 
                  
                 
                
               
              
              
               
                
                 
                 
                   255 
                  
                 
                   , 
                  
                  
                 
                   a 
                  
                 
                   + 
                  
                 
                   b 
                  
                 
                   > 
                  
                 
                   255 
                  
                 
                
               
              
             
            
           
          
          
          
          
            (1) 
           
          
         
        
       
         a + b= \begin{cases} a+b,\quad a+b\leq 255\\ 255, \quad a+b>255 \end{cases} \tag{1} 
        
       
     a+b={a+b,a+b≤255255,a+b>255(1)
 即如果原图某个像素值a=200,而欲增强的亮度值为b=88,则cv2.add()方法的运算结果并不是a + b = 288, 而是255(相加结果超过255,一律取255)。
小结
经过上述分析,当需要对一张图像进行亮度增强或者对两幅图像进行叠加操作时,相比于“+”运行符,cv2.add()方法是更为安全的方案。


















