当前位置: 首页 > 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()

小结

相关文章:

  • 【CSS 行高陷阱:如何避免文本被截断问题】
  • 【RESTful接口设计规范全解析】URL路径设计 + 动词名词区分 + 状态码 + 返回值结构 + 最佳实践 + 新手常见误区汇总
  • Day43 复习日 图像数据集——CNN
  • 数据结构进阶 - 第一章 绪论
  • linux cp与mv那个更可靠
  • 2-深度学习挖短线股-2-训练数据计算
  • Elasticsearch 中的精确搜索与模糊搜索
  • 从手机随拍到标准扫描件:AI如何智能校正证件照片(Python+OpenCV)
  • 机器人系统ROS中包内节点启动详解和实战示例
  • Maven配置本地仓库、中央仓库、公司私有仓库
  • 笔记04:层叠的定义及添加
  • 【机器学习深度学习】线性回归
  • 高中成绩可视化平台开发笔记
  • Jenkins 部署与使用
  • Nordic nRF52832 寄存器级 UARTE 发送实现
  • Python中的多线程与协程:程序、线程、进程之间的关联关系
  • 发布:大彩DN系列3.2寸全视角IPS串口屏发布!
  • MySQL(基础篇)
  • Django 零基础起步:开发你的网站第一步
  • 阿里推出 R1-Omni:将强化学习与可验证奖励(RLVR)应用于全模态大语言模型