当前位置: 首页 > news >正文

python + opencv实现简单的文字水印

原理:

加水印

1 将8位像素的最低位清零 

2 创建一个0矩阵,并在上面写字,然后二值化,并将255值设置为0.这一步可以简化一下,

例如:

dst[dst == 255] = 1

3 将生成的01图火上最低位被清零的图片

取出水印

1 将图片和1矩阵做与运算

2 将计算结果中的1设置为255

dst[dst == 1] = 255

OK显示即可

第一版测试

import cv2 as cv
import numpy as np# 读取图像
img = cv.imread('jk.jpg', cv.IMREAD_GRAYSCALE)# 创建一个黑色背景的图像
myimg = np.zeros(img.shape, np.uint8)# 在黑色背景上添加文本
cv.putText(myimg, 'Hello', (100, 100), cv.FONT_HERSHEY_SIMPLEX, 2, [255], thickness=3)# 显示带有文本的图像
cv.imshow('myimg', myimg)# 对 myimg 进行阈值处理以提取文字
ret, dst = cv.threshold(myimg, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
cv.imshow('Extracted dst', dst)
print(ret)
dst[dst > 0] = 1
dst[dst == 1] = 255
cv.imshow('Extracted dst 2', dst)
dst[dst == 255] = 1
print(dst[100:120,100:120])
# 显示提取出的文字
cv.imshow('Extracted Text', dst)
img = img[:,:] & 254img = cv.bitwise_or(img, dst)
cv.imshow('new image', img)newword =img & 1
ret, dst = cv.threshold(newword, 0, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)
cv.imshow('newword dst', dst)cv.waitKey(0)
cv.destroyAllWindows()

执行结果:

第二版测试

import cv2 as cv
import numpy as np# 读取图像
img = cv.imread('jk.jpg', cv.IMREAD_GRAYSCALE)
# 创建一个黑色背景的图像
word_img = np.zeros(img.shape, np.uint8)
# 在黑色背景上添加文本
cv.putText(word_img, 'Hello', (100, 100), cv.FONT_HERSHEY_SIMPLEX, 2, [1], thickness=3)
img = img & 254
img = cv.bitwise_or(img, word_img)
cv.imshow('new image', img)
newword =img & 1
newword[newword == 1] = 255
cv.imshow('newword dst', newword)cv.waitKey(0)
cv.destroyAllWindows()

 

第三版测试,转成彩色的

import cv2 as cv
import numpy as np# 读取图像
img = cv.imread('jk.jpg', cv.IMREAD_GRAYSCALE)
# 创建一个黑色背景的图像
word_img = np.zeros(img.shape, np.uint8)
# 在黑色背景上添加文本
cv.putText(word_img, 'Hello', (100, 100), cv.FONT_HERSHEY_SIMPLEX, 2, [1], thickness=3)
img = img & 254
img = cv.bitwise_or(img, word_img)
cv.imshow('new image', img)
newword =img & 1
newword = cv.cvtColor(newword, cv.COLOR_GRAY2BGR)
mask = np.all(newword == 1, axis=2)
newword[mask] = [255, 255, 0]cv.imshow('newword dst', newword)cv.waitKey(0)
cv.destroyAllWindows()

小结

http://www.lqws.cn/news/534205.html

相关文章:

  • 【LLM论文阅读】
  • 如果你在为理解RDA、PCA 和 PCoA而烦恼,不妨来看看丨TomatoSCI分析日记
  • [Andrej Karpathy] 大型语言模型作为新型操作系统
  • vue3 json 转 实体
  • 2D 基准情况下贝叶斯优化应用的概率推理
  • Ubuntu下布署mediasoup-demo
  • zabbix监控Centos 服务器
  • 波动方程能量守恒证明
  • dockers virbox 安装
  • COZE API上传文件 直接从前端发送就可以,而通过后端发请求给CozeAPI就不行,为什么?
  • Spring Boot 部署与打包方式详解(Jar vs War)
  • Windows命令连接符的安全风险分析与防御策略
  • SQLMesh:数据建模与版本控制的革新者
  • inverse-design-of-grating-coupler-3d(2)
  • 鸿蒙实时音视频流处理框架开发实战——基于HarmonyOS 4.0与分布式软总线的低延时高可靠架构
  • 从提示工程(Prompt Engineering)到上下文工程(Context Engineering)
  • PyTorch 模型镜像下载与安装指南
  • R 语言简介:数据分析与统计的强大工具
  • DSP学习笔记1
  • 声网对话式AI构建商品场景语义理解能力
  • 基于SpringBoot文件管理系统中的分片上传实现
  • 使用API有效率地管理Dynadot域名,出售账户中的域名
  • OpenCV CUDA模块设备层-----逐通道最小值比较函数min()
  • SpringBoot 中 @Transactional 的使用
  • 【LLM安全】MCP(模型上下文协议)及其关键漏洞、技术细节
  • 力扣网C语言编程题:搜索插入位置
  • mac电脑安装vscode的力扣插件报错解决办法
  • element-plus 按钮 展开/隐藏
  • 百面Bert
  • Ubuntu 搭建Kubernetes 1.28版本集群