OpenCV的使用——图像的算术运算之批量抠图添加水印

1.1 图像常用的处理操作

1)cv2.cvtColor 颜色空间转换函数

用于改变图像的颜色空间

cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)   #彩色图像转灰度图像

2)cv2.threshold 阈值处理函数

cv2.threshold(src, thresh, maxval, type[, dst]),返回值为retval, dst
其中:
src是灰度图像
thresh是起始阈值
maxval是最大值
type是定义如何处理数据与阈值的关系。有以下几种:
在这里插入图片描述

因此我们可以通过这个函数制作掩模图。

import cv2
# 加载图片
img2 = cv2.imread('test.png')
# 现在创建logo的掩码
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)  #转为灰度图
ret, mask = cv2.threshold(img2gray, 240, 255, cv2.THRESH_BINARY)  #对图像进行阈值处理
cv2.imshow('img2',img2)
cv2.imshow('mask',mask)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

观察图像原图,会发现主体部分的像素值均为255以下(全黑为0,全白为255),为抠出图像主体部分我们可以把阈值设置为240,这样主体部分像素都被设置为0,即黑色。

3)cv2.bitwise_not 像素值取反函数

import cv2
# 加载图片
img2 = cv2.imread('test.png')
# 现在创建logo的掩码
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)  #转为灰度图
ret, mask = cv2.threshold(img2gray, 240, 255, cv2.THRESH_BINARY)  #对图像进行阈值处理
mask_inv = cv2.bitwise_not(mask)   #像素值取反操作
cv2.imshow('img2',img2)
cv2.imshow('mask',mask)
cv2.imshow('mask_inv',mask_inv)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

4)cv2.bitwise_and 提取图像的掩模区域

简单来说,掩模图的黑色区域会把原图对应的区域全部变为黑色,白色区域则会保留原图部分

import cv2
# 加载图片
img2 = cv2.imread('test.png')
# 现在创建logo的掩码
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)  #转为灰度图
ret, mask = cv2.threshold(img2gray, 240, 255, cv2.THRESH_BINARY)  #对图像进行阈值处理
mask_inv = cv2.bitwise_not(mask)   #像素值取反操作
# 仅从logo图像中提取logo区域
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
cv2.imshow('img2',img2)
cv2.imshow('mask_inv',mask_inv)
cv2.imshow('img2_fg',img2_fg)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

5)cv2.and 图像的加法运算函数

函数 cv2.add() 对两张相同大小和类型的图像进行加法运算。

注意:OpenCV 加法和 numpy 加法之间有区别:cv2.add() 是饱和运算(相加后如大于 255 则结果为 255),而 Numpy 加法是模运算(250+10 = 260 % 256 = 4)
在这里插入图片描述

1.2 抠图添加水印小案例

最后利用上面学习的方法实现一个完整的抠图贴图效果:
在这里插入图片描述

import cv2
# 加载两张图片
img1 = cv2.imread('test.jpg')
img2 = cv2.imread('test.png')
rows,cols,channels = img2.shape

#制作两个掩码
# 现在创建logo的掩码,并同时创建其相反掩码
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)  #转为灰度图
ret, mask = cv2.threshold(img2gray, 240, 255, cv2.THRESH_BINARY)  #对图像进行阈值处理
mask_inv = cv2.bitwise_not(mask)   #像素值取反操作
cv2.imshow('img2',img2)
cv2.imshow('mask',mask)
cv2.imshow('mask_inv',mask_inv)
cv2.waitKey(0)
cv2.destroyAllWindows()

#提取图像与logo相同大小的区域,并制作两个掩模图,最后add叠加,并把叠加图放回原图位置
roi = img1[0:rows, 0:cols ]
# 现在将ROI中logo的区域涂黑
img1_bg = cv2.bitwise_and(roi,roi,mask = mask)
# 仅从logo图像中提取logo区域
img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv)
dst = cv2.add(img1_bg,img2_fg)
cv2.imshow('roi',roi)
cv2.imshow('img1_bg',img1_bg)
cv2.imshow('img2_fg',img2_fg)
cv2.imshow('dst',dst)
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述
老样子,如果有所收益的话,感谢关注,持续更新,大家一起学习进步!当前关注可领取200G的深度学习入门课程,并进入微信“AI交流群”一起交流进步!

文章首发于个人公众号:Python深度学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值