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()