OpenCV学习笔记 - OpenCV图像运算

文章目录

  • OpenCV学习笔记 - 图像运算
    • 图像算术运算
      • cv2.add(img1,img2)
      • cv2.subtract(img1,img2)
      • cv2.addWeighted(img1,alpha,img2,beta,gamma)
    • 图像位运算
      • cv2.bitwise_not(img)
      • cv2.bitwise_and(img1,img2)
      • cv2.bitwise_or(img1,img2) cv2.bitwise_xor(img1,img2)
    • 课程大作业 - 图像添加水印
      • 基本步骤
        • 引入一幅图片
        • 要有一个LOGO
        • 计算图片在什么地方添加,在添加的地方变成黑色
        • 利用add,将LOGO与图片叠加在一起
        • 展示效果
      • 实验效果

OpenCV学习笔记 - 图像运算

图像算术运算

cv2.add(img1,img2)

  • 功能:图像相加 (注意:img1,img2的图像的尺寸必须是一致的)

  • 参数说明

    • img1 : 作矩阵相加的图像1(numpy类型)
    • img2 : 作矩阵相加的图像2(numpy类型)
  • 运算规则
    在这里插入图片描述

  • 代码实例

    import cv2
    import numpy as np
    
    # 读取图片
    img1 = cv2.imread('./img/AI_Security.jpg')
    
    # 图的加法运算就是矩阵的加法运算
    # 注意加法运算的两张图尺寸必须是一样的
    img2 = np.ones(img1.shape,np.uint8) * 50
    
    # 图像相加的结果
    res = cv2.add(img1,img2)
    
    # 展示图片
    cv2.imshow('img1',img1)
    cv2.imshow('img2',img2)
    cv2.imshow('res',res)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    
  • 实验效果:增加img1图像的亮度
    OpenCV学习笔记 - OpenCV图像运算_第1张图片

cv2.subtract(img1,img2)

  • 功能:图像相减 (注意:img1,img2的图像的尺寸必须是一致的)

  • 参数说明

    • img1 : 作矩阵相减的图像1(numpy类型)
    • img2 : 作矩阵相减的图像2(numpy类型)
  • 运算规则
    OpenCV学习笔记 - OpenCV图像运算_第2张图片

  • 代码实例:继图像相加的代码,将图像复原

    # 图像相减
    origin = cv2.subtract(res,img2)
    
    # 展示图片
    cv2.imshow('origin',origin)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
    	cv2.destroyAllWindows()
    
  • 实验效果
    OpenCV学习笔记 - OpenCV图像运算_第3张图片

  • 补充:为了让图像相乘和相除更快可以用 cv2.multiply(img1,img2) cv2.divide(img1,img2)

cv2.addWeighted(img1,alpha,img2,beta,gamma)

  • 功能:实现图像融合
  • 参数说明
    • img1:需要融合的图像1
    • alpha:img1融合所占权重
    • img2:需要融合的图像2
    • beta:img2融合所占权重
    • gamma:静态权重(简单理解为偏置项)
  • 运算规则
    在这里插入图片描述
  • 代码实例
    import cv2
    import numpy as np
    
    ## 创建窗口
    cv2.namedWindow('img1',cv2.WINDOW_NORMAL)
    cv2.namedWindow('img2',cv2.WINDOW_NORMAL)
    cv2.namedWindow('res',cv2.WINDOW_NORMAL)
    
    ## 设置展示窗口的大小
    cv2.resizeWindow('img1',480,480)
    cv2.resizeWindow('img2',480,480)
    cv2.resizeWindow('res',480,480)
    
    ## 读取图片
    img1 = cv2.imread('./img/AI_Security.jpg')
    img2 = cv2.imread('./img/TSU.jpg')
    
    ## 由于读入的两张图片尺寸是不一样的,因此我们需要将其尺寸保持一致
    print(img1.shape)
    img2 = cv2.resize(img2,(img1.shape[1],img1.shape[0]),interpolation=cv2.INTER_CUBIC)
    print(img2.shape)
    
    
    ## 图片融合
    res = cv2.addWeighted(img1,0.9,img2,0.1,0)
    
    ## 展示图片
    cv2.imshow('img1',img1)
    cv2.imshow('img2',img2)
    cv2.imshow('res',res)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    
  • 实验效果
    OpenCV学习笔记 - OpenCV图像运算_第4张图片

图像位运算

cv2.bitwise_not(img)

  • 功能:将图像进行像素的二进制值按位翻转

  • 参数说明

    • img : 需要图像按位翻转的图像
  • 代码实例

    import cv2
    import numpy as np
    
    ## 初始化一张黑白单通道图片
    img = np.ones((200,200),np.uint8)
    
    # 在图像中间挖一块白色的矩形
    img[50:150,50:150] = 255
    cv2.imshow('img',img)
    
    # 将图片翻转
    img2 = cv2.bitwise_not(img)
    cv2.imshow('img2',img2)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    
  • 实验效果
    OpenCV学习笔记 - OpenCV图像运算_第5张图片

cv2.bitwise_and(img1,img2)

  • 代码功能:将图像进行像素的二进制值按位与运算

  • 参数说明

    • img1:需要作按位与运算的图像1
    • img2:需要作按位与运算的图像2
  • 实验效果
    OpenCV学习笔记 - OpenCV图像运算_第6张图片

cv2.bitwise_or(img1,img2) cv2.bitwise_xor(img1,img2)

  • 代码功能:实现图像的按位或/异或运算,或or运算整合图像信息/异或xor运算实现重叠部分标暗

  • 参数说明

    • img1:需要作按位与运算的图像1
    • img2:需要作按位与运算的图像2
  • 代码实例

    import cv2
    import numpy as np
    
    img1 = np.zeros((200,200),np.uint8)
    img1[50:120,50:120] = 255
    img2 = np.zeros((200,200),np.uint8)
    img2[80:150,80:150] = 255
    
    
    cv2.imshow('img1',img1)
    cv2.imshow('img2',img2)
    
    ## 或:整合信息
    img_or = cv2.bitwise_or(img1,img2)
    
    ## 异或:将重合部分标黑
    img_xor = cv2.bitwise_xor(img1,img2)
    
    
    cv2.imshow('img_or',img_or)
    cv2.imshow('img_xor',img_xor)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
        cv2.destroyAllWindows()
    
  • 实验效果
    OpenCV学习笔记 - OpenCV图像运算_第7张图片

课程大作业 - 图像添加水印

基本步骤

引入一幅图片
# 导入图片
ai_security = cv2.imread('./img/AI_Security.jpg')
要有一个LOGO
# logo
tsu = cv2.imread('./img/TSU.jpg')
计算图片在什么地方添加,在添加的地方变成黑色
mask = np.full((200,200),255,np.uint8)
m = cv2.bitwise_not(mask)

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

# 与m进行与操作(挖去需要添加logo的位置)
tmp = cv2.bitwise_and(roi,roi,mask=m)
利用add,将LOGO与图片叠加在一起
# 添加logo
dst = cv2.add(tmp,tsu)
ai_security[0:200,0:200] = dst
展示效果
## 展示图片
cv2.imshow('ai',ai_security)
key = cv2.waitKey(0)
if key & 0xFF == ord('q'):
    cv2.destroyAllWindows()

实验效果

OpenCV学习笔记 - OpenCV图像运算_第8张图片

你可能感兴趣的:(Computer,Vison,opencv,计算机视觉,学习)