OPENCV添加图片水印

OPENCV添加图片水印


别的不说,先上来看看效果

在这里插入图片描述

场景

最近本人由于工作原因在学习使用opencv,同事最近正好帮同事一个忙,搞一个能够为图片增加水印的算法,要求是水印成45度角填满整个背景图,后来由于需求的变更做了别的版本的代码,为了不让自己的努力白费,记录一下原始代码的思路。

思路

制作水印的思路如下:

  1. 首先生成一张比较长单行水印图,在后期进行贴图

    在这里插入图片描述

  2. 对贴图进行仿射变换,旋转45°,获得旋转矩阵

    使用opencv的官方代码,令旋转中心为单行水印图的中心,旋转45°

    M = cv2.getRotationMatrix2D((int(bar_w/2),int(bar_h/2)),45,1)
    
  3. 修改旋转矩阵,将图选购平移到原点附近
    在这里插入图片描述

    # 矩阵的第三列为平移参数,可以将旋转后的图像平移到中心
    M[0][2] = M[0][2] - bar_w/2
    M[1][2] = M[1][2] - bar_h/2
    
  4. 根据字体的大小以及间距,不断贴图直至水印充满整个背景图

在这里插入图片描述

# 不断平移
    M[0][2] += i * (间隔距离+ 字号)
    M[1][2] += i * (间隔距离+ 字号)
  1. 使用cv2.copyTo函数将非黑色的部分贴到背景上

    在这里插入图片描述

CODE

运行这份脚本需要使用的依赖如下:

import os
import cv2
import math
import random
import numpy as np
from matplotlib import pyplot as plt
from PIL import ImageFont, Image, ImageDraw

核心代码:

def text_bar(mask_shape, text, text_size, text_gray, font_path):
    """
    This method get mark bar.

    Input:
        mask_shape: The shape of mark (H,W).
        text: The text of watermarking.
        text_size: The size of word
        text_gray: 1-255
        font_path: The path of word font.
        
    Output:
        bar: The img_data contain the watermark (RGB)
    """

    # 获取 watermarking bar
    (H, W) = mask_shape
    draw_text = ""
    for i in range(100):
        draw_text += "   {}".format(text)
    bar_w = int(2*math.sqrt((H**2 + W**2)))
    bar_h = int(text_size * 1.1)
    bar = Image.new('RGB', (bar_w, bar_h))
    draw = ImageDraw.Draw(bar)
    font1 = ImageFont.truetype(font_path, text_size)
    t_loc_x = int(text_size * random.uniform(0.1,0.5)+3)
    t_loc_y = int((bar_h - text_size)/2)
    draw.text((t_loc_x, t_loc_y), draw_text, fill = (text_gray, text_gray ,text_gray),font=font1)
    return bar

def water_mask(img_data, text, text_size, text_gray, interval_size, font_path):
    """
    This method get watermarking of a picture.

    Input:
        img_data: The img_data base on numpy.
        text: The text of watermarking.
        text_size: The size of word
        text_gray: 1-255
        interval_size: The interval distance between 2 marking.
        font_path: The path of word font.

    Output:
        res_data: The img_data contain the watermark based on numpy (H,W,3)(BGR)
    """
    (H,W,C) = img_data.shape
    # 获取蒙版
    Mask = np.zeros((H,W,C)).astype(np.int8)

    # 获取 watermarking bar
    bar = text_bar((H,W), text, text_size, text_gray, font_path)
    cv_bar = np.asarray(bar)
    cv_bar = cv2.cvtColor(cv_bar, cv2.COLOR_RGB2BGR)

    # (BGR)

    bar_h, bar_w, _ = cv_bar.shape

    # 获得旋转矩阵
    paste_time = int((H + W) / (text_size + interval_size)) + 1
    for i in range(paste_time):
        paste_img = cv_bar.copy()
        M = cv2.getRotationMatrix2D((int(bar_w/2),int(bar_h/2)),45,1)
        M[0][2] = M[0][2] - bar_w/2 + i * (interval_size + text_size)
        M[1][2] = M[1][2] - bar_h/2 + i * (interval_size + text_size)
        dst= cv2.warpAffine(paste_img, M, (int(W),int(H)), borderValue=0)
        Mask = cv2.copyTo(src=dst, mask=dst, dst=Mask)

    # Mask = cv2.cvtColor(Mask, cv2.COLOR_BGR2BGR)
  
    return Mask

def gradualMask(Mask):
    """
    Mask : The Mask of watermark, it's channel is BGR
    """
    c_d = 60
    
    Mask[160:860,160:560,:] = 0
    w_s = 160-c_d
    w_e = 560+c_d
    
    h_s = 160-c_d
    h_e = 860+c_d
    
    for i in range(c_d):
        Mask[h_s+i:h_e-i, w_s+i:w_e-i,:] = Mask[h_s+i:h_e-i, w_s+i:w_e-i,:] * 0.9555
    
    Mask = Mask.astype(np.uint8)
    return Mask
    
def hybrid_img(Mask, Img_data, transparent):
    """
    The metho can hybrid the watermark and background img.
    
    Input:
        Mask : The Mask of watermark, it's channel is BGR
        Img_data : The img data that you want to add watermark, its channel is BGR
        transparent: The transparent ratio of watermark(0-1)

    Output:
        res: The output img, its channel is BGR

    """
    # Mask[:,:,3] = transparent
    # Img_data = cv2.cvtColor(Img_data, cv2.COLOR_BGR2BGRA)
    process = Img_data.copy()
    process = process.astype(np.uint8)
    res = cv2.addWeighted(process, 1, Mask, transparent,0)
    res = cv2.cvtColor(res, cv2.COLOR_BGRA2BGR)

    return res
img = cv2.imread("Path/to/img.png")
Mask = water_mask(img, "光头强", 60, 169, 50, "Path/to/fontfile/SOURCEHANSANSCN_HEAVY.OTF")
res = hybrid_img(Mask, img, 0.2)
res = cv2.cvtColor(res, cv2.COLOR_BGR2RGB)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Android上使用OpenCV图片添加文字水印可以通过以下步骤实现: 1. 导入OpenCV库:首先需要在Android项目中导入OpenCV库文件,可以从OpenCV官方网站下载或者使用Gradle依赖方式导入。 2. 图片加载:使用Android提供的方式加载需要加水印图片,例如使用BitmapFactory.decodeResource()方法加载本地资源图片,或者使用第三方库加载网络图片。 3. 创建OpenCV Mat对象:使用OpenCV库提供的Mat类,将加载的图片转为Mat对象用于后续操作。可以使用Imgcodecs.imread()方法将Bitmap转为Mat。 4. 添加文字水印:使用OpenCV提供的绘制文本的方法将文字水印添加到Mat对象中。可以使用Imgproc.putText()方法指定水印的位置、文本内容、颜色、字体大小等参数。 5. 转换为Bitmap:将带有水印的Mat对象转换为Bitmap对象。可以使用Bitmap.createBitmap()方法将Mat转为Bitmap。 6. 保存图片:可以选择将带有水印的Bitmap保存到本地存储器或者上传到服务器。使用Bitmap.compress()方法可以将Bitmap对象转为文件输出流,然后保存到指定路径。 需要注意的是,在添加文字水印之前,可能需要对图片进行一些预处理,例如调整大小、旋转、裁剪等操作,可以使用OpenCV提供的相关方法。 以上是使用OpenCV在Android上给图片加文字水印的简要步骤说明,具体实现可以参考OpenCV官方文档和相关示例代码。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

还有头发的光头强

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值