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深度学习