Skip to content

图像运算

图像的加法运算

  • cv2.add
    import cv2
    import numpy as np
    
    dog = cv2.imread('./dog.jpeg')
    
    # 图的加法运算就是矩阵的加法运算
    # 因此,加法运算的两张图必须是相等的
    # print(dog.shape) 打印出图像的宽、高、通道数
    
    img = np.ones((1200, 1920, 3), np.uint8) * 50
    cv2.imshow('orig', dog)
    
    result = cv2.add(dog, img)
    cv2.imshow('result', result)
    
    cv2.waitKey(0)
    

Image title

结果

图像的减法运算

  • cv2.subtract
    import cv2
    import numpy as np
    
    dog = cv2.imread('./dog.jpeg')
    
    # 图的加法运算就是矩阵的加法运算
    # 因此,加法运算的两张图必须是相等的
    # print(dog.shape) 打印出图像的宽、高、通道数
    
    img = np.ones((1200, 1920, 3), np.uint8) * 50
    cv2.imshow('orig', dog)
    
    result = cv2.subtract(dog, img)
    cv2.imshow('result', result)
    
    cv2.waitKey(0)
    

Image title

结果

图像的溶合

  • addWeighted(A, alpha, B, bate, gamma)
    1. A 溶合图像A
    2. alpha 溶合图像A溶合之后显示的权重
    3. B 溶合图像B
    4. bate 溶合图像B溶合之后显示的权重
    5. gamma 静态权重 将溶合之后的所有图像都加一个gamma值
      import cv2
      
      img1 = cv2.imread('./back.jpeg')
      img2 = cv2.imread('./smallcat1.jpeg')
      
      # 只有两张图片的属性一样才可以进行溶合
      print(img1.shape)
      print(img2.shape)
      
      result = cv2.addWeighted(img2, 0.7, img1, 0.3, 0)
      cv2.imshow('show', result)
      cv2.waitKey(0)
      
      Image title
      结果

OpenCV位运算-非操作

  • bitwise_not(img)

    import cv2
    import numpy as np
    
    # 创建一张图片
    img = np.zeros((200, 200), np.uint8)
    
    img[50: 150, 50: 150] = 255
    
    reverse_img = cv2.bitwise_not(img)
    
    cv2.imshow('origin', img)
    cv2.imshow('reverse', reverse_img)
    cv2.waitKey(0)
    

    Image title
    结果

OpenCV位运算-与运算

  • bitwise_and(img, img) 两个图像的交集

    import cv2
    import numpy as np
    
    img1 = np.zeros((200, 200), np.uint8)
    img2 = np.zeros((200, 200), np.uint8)
    
    img1[20: 120, 20:120] = 255
    img2[80: 180, 80:180] = 255
    
    new_img = cv2.bitwise_and(img1, img2)
    
    cv2.imshow('img1', img1)
    cv2.imshow('img2', img2)
    cv2.imshow('new_img', new_img)
    cv2.waitKey(0)
    

    Image title
    结果

OpenCV位运算-或与异或

  • bitwise_or(img1, img2) 或操作 两个集合所有的值 并集
  • bitwise_xor(img, img2) 异或操作 交集的部分为0 非交集的部分为1 相同为假不同为真

    import cv2
    import numpy as np
    
    img1 = np.zeros((200, 200), np.uint8)
    img2 = np.zeros((200, 200), np.uint8)
    
    img1[20: 120, 20:120] = 255
    img2[80: 180, 80:180] = 255
    
    # 或操作
    # new_img = cv2.bitwise_or(img1, img2)
    
    # 异或操作
    # new_img = cv2.bitwise_xor(img1, img2)
    
    cv2.imshow('img1', img1)
    cv2.imshow('img2', img2)
    cv2.imshow('new_img', new_img)
    cv2.waitKey(0)
    

    Image title
    或操作
    Image title
    异或操作

为图像添加水印

#1. 引入一幅图片,dog
#2. 要有一个LOGO,需要自己创建
#3. 计算图片在什么地方添加,在添加的地方变成黑色
#4. 利用add,将logo 与 图处叠加到一起

import cv2
import numpy as np

#导入图片
dog = cv2.imread('./dog.jpeg')

#创建LOGO和mask
logo = np.zeros((200, 200, 3), np.uint8)
mask = np.zeros((200, 200), np.uint8)

#绘制LOGO
logo[20:120, 20:120] = [0,0,255]
logo[80:180, 80:180] = [0,255,0]

mask[20:120, 20:120] = 255
mask[80:180, 80:180] = 255

#对mask按位求反
m = cv2.bitwise_not(mask)

#选择dog添加logo的位置
roi = dog[0:200, 0:200]

#与m进行与操作
tmp = cv2.bitwise_and(roi, roi, mask = m)

dst = cv2.add(tmp, logo)

dog[0:200,0:200] = dst

cv2.imshow('dog', dog)
# cv2.imshow('dst', dst)
# cv2.imshow('tmp', tmp)
# cv2.imshow('m', m)
# cv2.imshow('mask', mask)
# cv2.imshow('logo', logo)
cv2.waitKey(0)

Image title

效果