OpenCV学习笔记 - OpenCV图像运算

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图像的亮度
    在这里插入图片描述

cv2.subtract(img1,img2)

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

  • 参数说明

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

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

    # 图像相减
    origin = cv2.subtract(res,img2)
    
    # 展示图片
    cv2.imshow('origin',origin)
    key = cv2.waitKey(0)
    if key & 0xFF == ord('q'):
    	cv2.destroyAllWindows()
    
  • 实验效果
    在这里插入图片描述

  • 补充:为了让图像相乘和相除更快可以用 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()
    
  • 实验效果
    在这里插入图片描述

图像位运算

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()
    
  • 实验效果
    在这里插入图片描述

cv2.bitwise_and(img1,img2)

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

  • 参数说明

    • img1:需要作按位与运算的图像1
    • img2:需要作按位与运算的图像2
  • 实验效果
    在这里插入图片描述

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()
    
  • 实验效果
    在这里插入图片描述

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

基本步骤

引入一幅图片
# 导入图片
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()

实验效果

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值