文章目录
- 1 普通加法
 - 1 加号相加
 - 2 add函数
 
- 2 加权相加
 - 3 按位运算
 - 1 按位与运算
 - 2 按位或运算、非运算
 
- 4 掩膜
 
1 普通加法
1 加号相加
在 OpenCV 中,图像加法可以使用加号运算符(+)来实现。例如,如果要将两幅图像相加,可以使用以下代码:
import cv2
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")
dst = img1 + img2
cv2.imshow("Result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
 
使用+相加的计算原理是:
 
     
      
       
        
         
         
          
           
            
             y
            
            
             (
            
            
             x
            
            
             )
            
            
             =
            
            
             
              {
             
             
              
               
                
                 
                  
                   a
                  
                  
                   +
                  
                  
                   b
                  
                  
                   ,
                  
                  
                  
                   a
                  
                  
                   +
                  
                  
                   b
                  
                  
                   ≤
                  
                  
                   255
                  
                 
                
               
              
              
               
                
                 
                  
                   (
                  
                  
                   a
                  
                  
                   +
                  
                  
                   b
                  
                  
                   )
                  
                  
                   %
                  
                  
                   256
                  
                  
                   ,
                  
                  
                  
                   a
                  
                  
                   +
                  
                  
                   b
                  
                  
                   >
                  
                  
                   255
                  
                 
                
               
              
             
            
           
          
         
         
         
        
       
       
         \begin{equation} y(x)=\left\{ \begin{aligned} a+b, \quad a+b\leq255\\ (a+b)\%256, \quad a+b>255\\ \end{aligned} \right . \end{equation} 
       
      
     y(x)={a+b,a+b≤255(a+b)%256,a+b>255
 即当两份图像相加之后超过上限时,其值为除以256之后的余数。(注意与add函数的计算原理区分)
2 add函数
函数cv2.add()可以用来计算图像像素值相加的和,其语法格式为:
计算结果=cv2.add(像素值a,像素值b)
 
使用add相加的计算原理是:
 
     
      
       
        
         
         
          
           
            
             y
            
            
             (
            
            
             x
            
            
             )
            
            
             =
            
            
             
              {
             
             
              
               
                
                 
                  
                   a
                  
                  
                   +
                  
                  
                   b
                  
                  
                   ,
                  
                  
                  
                   a
                  
                  
                   +
                  
                  
                   b
                  
                  
                   ≤
                  
                  
                   255
                  
                 
                
               
              
              
               
                
                 
                  
                   255
                  
                  
                   ,
                  
                  
                  
                   a
                  
                  
                   +
                  
                  
                   b
                  
                  
                   >
                  
                  
                   255
                  
                 
                
               
              
             
            
           
          
         
         
         
        
       
       
         \begin{equation} y(x)=\left\{ \begin{aligned} a+b, \quad a+b\leq255\\ 255, \quad a+b>255\\ \end{aligned} \right . \end{equation} 
       
      
     y(x)={a+b,a+b≤255255,a+b>255
通过对比可以看出两个方式的差异
import cv2  
  
a = cv2.imread("lenacolor.png", 0)  
b = a  
result1 = a + b  
result2 = cv2.add(a, b)  
cv2.imshow("original", a)  
cv2.imshow("+", result1)  
cv2.imshow("add", result2)  
cv2.waitKey()  
cv2.destroyAllWindows()
 

除了两个图像相加之外,图像还可以直接与数字相加:
 
     
      
       
        
         i
        
        
         m
        
        
         g
        
        
         1
        
        
         =
        
        
         
          ∣
         
         
          
           
            
             
              1
             
            
           
           
            
             
              1
             
            
           
           
            
             
              1
             
            
           
          
          
           
            
             
              2
             
            
           
           
            
             
              2
             
            
           
           
            
             
              2
             
            
           
          
          
           
            
             
              3
             
            
           
           
            
             
              3
             
            
           
           
            
             
              3
             
            
           
          
         
         
          ∣
         
        
       
       
         img1 = \left| \begin{array}{} 1 & 1 & 1 \\ 2 & 2 & 2\\ 3 & 3 & 3 \end{array} \right| 
       
      
     img1=
              123123123
              
 执行img2=cv2.add(img1,3)运算后,可得到:
     
      
       
        
         i
        
        
         m
        
        
         g
        
        
         2
        
        
         =
        
        
         
          ∣
         
         
          
           
            
             
              4
             
            
           
           
            
             
              4
             
            
           
           
            
             
              4
             
            
           
          
          
           
            
             
              5
             
            
           
           
            
             
              5
             
            
           
           
            
             
              5
             
            
           
          
          
           
            
             
              6
             
            
           
           
            
             
              6
             
            
           
           
            
             
              6
             
            
           
          
         
         
          ∣
         
        
       
       
         img2 = \left| \begin{array}{} 4 & 4 & 4 \\ 5 & 5 & 5\\ 6 & 6 & 6 \end{array} \right| 
       
      
     img2=
              456456456
              
2 加权相加
cv2.addWeighted() 函数是 OpenCV 中的图像加权混合函数。该函数可以将两幅图像按照给定的比例进行混合,得到新的图像。
 加权相加的计算方法为:
     
      
       
        
         r
        
        
         e
        
        
         s
        
        
         u
        
        
         l
        
        
         t
        
        
         =
        
        
         a
        
        
         c
        
        
         r
        
        
         1
        
        
         ×
        
        
         a
        
        
         l
        
        
         p
        
        
         h
        
        
         a
        
        
         +
        
        
         a
        
        
         c
        
        
         r
        
        
         2
        
        
         ×
        
        
         b
        
        
         e
        
        
         t
        
        
         a
        
        
         +
        
        
         g
        
        
         a
        
        
         m
        
        
         m
        
        
         a
        
       
       
        result = acr1×alpha + acr2×beta + gamma
       
      
     result=acr1×alpha+acr2×beta+gamma
 该函数的语法格式如下:
cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) -> dst
 
参数说明:
src1:第一幅图像。alpha:第一幅图像的比例系数。src2:第二幅图像。beta:第二幅图像的比例系数。gamma:结果图像的亮度调节,不调节则填0,但不可省略。dst:结果图像。dtype:结果图像的数据类型。
3 按位运算
1 按位与运算
OpenCV 中的按位与运算的计算原理是二进制位的位与运算。
 在计算机中,图像的像素是以二进制位的形式存储的,因此按位与运算就是对两个图像的对应像素的二进制位进行“与”运算。
 按位与运算的结果取决于两个数的二进制位上的值,如果两个二进制位都是 
    
     
      
       
        1
       
      
      
       1
      
     
    1,则结果为 
    
     
      
       
        1
       
      
      
       1
      
     
    1,否则结果为 
    
     
      
       
        0
       
      
      
       0
      
     
    0。
 例如,如果 
    
     
      
       
        A
       
       
        =
       
       
        10
       
      
      
       A=10
      
     
    A=10(二进制为 
    
     
      
       
        1010
       
      
      
       1010
      
     
    1010),
    
     
      
       
        B
       
       
        =
       
       
        6
       
      
      
       B=6
      
     
    B=6(二进制为 
    
     
      
       
        0110
       
      
      
       0110
      
     
    0110),则 
    
     
      
       
        A
       
       
         and 
       
       
        B
       
       
        =
       
       
        2
       
      
      
       A \ \text{and} \ B = 2
      
     
    A and B=2(二进制为 
    
     
      
       
        0010
       
      
      
       0010
      
     
    0010)。
 在 OpenCV 中,按位与运算可以应用于图像的二值化、边缘检测、形状分析等。通过按位与运算,可以将图像的某些部分提取出来,从而获得更多有用的信息。
 通过这一特性,可以实现图片的按掩膜提取功能。
import cv2  
import numpy as np  
  
a = cv2.imread("lenacolor.png", 0)  
b = np.zeros(a.shape, dtype=np.uint8)  
b[100:400, 200:400] = 255  
c = cv2.bitwise_and(a, b)  
cv2.imshow("a", a)  
cv2.imshow("b", b)  
cv2.imshow("c", c)  
cv2.waitKey()  
cv2.destroyAllWindows()
 

2 按位或运算、非运算
OpenCV 中的按位或运算(Bitwise Or)和非运算(Bitwise Not)是对图像中的每一个像素进行二进制位上的运算。
- 按位或运算:按位或运算的结果取决于两个数的二进制位上的值,如果两个二进制位中至少有一个是 1 1 1,则结果为 1 1 1,否则结果为 0 0 0。
 - 非运算:非运算是对图像中每一个像素的二进制位取反,如果原来是 0 0 0,则结果为 1 1 1;如果原来是 1 1 1,则结果为 0 0 0。
 
在 OpenCV 中,可以使用 cv2.bitwise_or() 和 cv2.bitwise_not() 函数来实现按位或运算和非运算,其使用方法同与运算。
4 掩膜
除了在按位与运算中执行掩膜操作外,在使用add函数时也可以通过mask信息。
import cv2
import numpy as np
img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")
mask = np.zeros(img1.shape[:2], dtype=np.uint8)
cv2.rectangle(mask, (100, 100), (200, 200), (255, 255, 255), -1)
dst = cv2.add(img1, img2, mask=mask)
cv2.imshow("Result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
 
在上面的代码中,首先创建了一个全黑的掩膜,然后使用 cv2.rectangle() 函数在掩膜上绘制了一个白色的矩形,该矩形代表了加法运算只需要应用到图像的一部分。
 最后,在调用 cv2.add() 函数时,将掩膜作为参数传入,从而只对图像的矩形区域进行加法运算。
















![[HSCSEC 2023] rev,pwn,crypto,Ancient-MISC部分](https://img-blog.csdnimg.cn/img_convert/0f2c43221175c94bc65826a707caea56.jpeg)


