机器视觉学习-day10-图像添加水印
代码运行步骤:
运行的结果是在源图像上添加一个模板输入图像的前景。
1 模板输入
此组件的功能是输入一个水印图片,需要进行灰度化与二值化,还需要制作掩膜。
模板图建议使用包含透明图层的png格式,png格式支持Alpha通道(透明度),jpg不支持此通道,但是OpenCV默认读取图片是BGR三通道,因此会减少png的Alpha通道,结果就是黑色。建议使用带透明的png图片作为水印。
2 与运算
有了二值化之后的模板输入图,就可以在原始图像中根据模板大小切割出一个ROI区域,即要添加水印的区域,让二值化之后的模板与原图切割出的ROI区域进行与运算。
3 图像融合
该组件的目的是将图像对应的位置像素进行叠加,需要注意的是两个像素数组的大小应该是相同的,另外还需要通道数相同。
原始图片:2.jpg
模板图像:1.png
import cv2if __name__ == '__main__':# 1. 图片输入path = '2.jpg' # 读取名为"1.png"的主图像,存储到变量image_np中。image_np = cv2.imread(path) # cv2.imread()函数读取图像文件,返回一个NumPy数组表示图像。# 2. 模板输入logo = cv2.imread('1.png') # 读取名为"dog.png"的logo图像,存储到变量logo中。# 3.灰度化gray_logo = cv2.cvtColor(logo, cv2.COLOR_BGR2GRAY)"""将彩色logo图像转换为灰度图像。cv2.cvtColor()函数用于颜色空间转换,这里将BGR格式转换为灰度格式。"""# 4.二值化ret, mask_logo = cv2.threshold(gray_logo,1,255,cv2.THRESH_BINARY_INV # 反阈值)"""对灰度logo图像进行二值化处理,生成掩膜(mask)。cv2.threshold()函数应用阈值处理:第一个参数gray_logo是输入图像第二个参数1是阈值,这里设为1第三个参数255是最大值第四个参数cv2.THRESH_BINARY_INV表示使用反向二值化反向二值化(# 反阈值)意味着:像素值大于1的变为0(黑色),小于等于1的变为255(白色)"""# 5. 与运算rows, cols = logo.shape[:2] # 获取logo图像的尺寸(高度和宽度)# logo.shape返回一个元组(高度, 宽度, 通道数),[:2]只取前两个值print(rows, cols)# 从原图中做ROI切割roi = image_np[:rows, :cols]# 从主图像中提取与logo相同大小的区域(ROI - Region of Interest)# image_np[:rows, :cols]使用数组切片获取左上角区域cv2.imshow('roi', roi) # 显示ROI区域cv2.imwrite('roi.jpg', roi) # 切割的图像# 位于操作需要传两个原图,之前的实验遇见过# mask_logo在位于操作中充当掩膜的角色image_np_bg = cv2.bitwise_and(roi,roi,mask=mask_logo)cv2.imshow('image_np_bg', image_np_bg)cv2.imwrite('image_np_bg.jpg', image_np_bg) # 掩膜"""cv2.bitwise_and()执行按位与操作:前两个参数是相同的输入图像(roi)mask=mask_logo指定掩膜,只有在掩膜非零的区域才会进行与操作这步操作的目的是在ROI中保留logo背景区域(掩膜中白色部分)"""# 6. 图像融合dst = cv2.add(image_np_bg, logo) # dst是小图融合后的结果,需要把像素值替换到原大图中"""将处理后的ROI背景与logo图像相加融合cv2.add()执行图像加法,将两个图像的像素值相加由于image_np_bg中logo区域是黑色(值为0),加上logo后,logo区域就显示出来了"""image_np[:rows, :cols] = dst# 将融合后的结果替换回原图像的相应位置# 7. 图片输出cv2.imshow('image_np', image_np)cv2.waitKey(0)cv2.imwrite('image_np.png', image_np)"""
整体逻辑:读取主图像和logo图像将logo转换为灰度图像并创建反向二值化掩膜从主图像中提取与logo相同大小的ROI区域使用掩膜在ROI区域中保留背景部分将处理后的ROI背景与logo图像相加融合将融合结果放回主图像的原始位置显示最终结果这种方法确保了logo能够自然地叠加到主图像上,同时保持了主图像背景在logo透明区域的可见性。
"""
ROI切割图像:roi.jpg
掩膜图像:image_np_bg.jpg
最后得到的图像: