Spaces:
Runtime error
Runtime error
File size: 3,611 Bytes
4baf7bf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
import io
import os
import shutil
import cv2 as cv
import numpy as np
import requests
from PIL import Image
class ImageWatermarkHandler:
def __init__(self):
pass
def index_watermark(self, img_path, block_size, step_len, threshold, temp_output_path):
"""
该代码首先读取图像,并定义了块的大小和阈值。然后,它遍历图像的每个块,并计算每个块的标准差。
如果标准差小于阈值,则认为当前块变化微小。然后将图片保存到本地(可选)并返回 list
:param img_path: img路径
:param watermark_size: 定义块的大小
:param step_len: 遍历的步长
:param threshold: 定义阈值
:param temp_output_path: sub_img临时保存路径
:return:
"""
# read img
img = cv.imread(img_path, cv.IMREAD_GRAYSCALE) # 把图像转成单通道的灰度图输出
# get width and height
height, width = img.shape
print("cur gray img width: %s,height: %s,block_size:%s" % (width, height, block_size))
block_num = int(height * width // block_size)
print("total split block num : %s" % (block_num))
# remove last res dir
# 不保存图片就不用创建文件夹
# if (os.path.exists(temp_output_path)):
# shutil.rmtree(temp_output_path)
# os.mkdir(temp_output_path)
# save pixel index to memory and lcoal file
list = []
# foreach block
for i in range(0, height, step_len):
for j in range(0, width, step_len):
# get pixel value
block = img[i:i + block_size, j:j + block_size]
# print("cur idx [%s,%s], block : %s " %(i,j,block))
# calculate std_dev
std_dev = np.std(block)
# print(" cur std_dev :{} ,cur threshold : {} ".format(std_dev, threshold)) # 测试的像素区域,w:45-65--->com
# 如果标准差小于阈值,则认为当前块变化微小
if std_dev < threshold and std_dev > 0:
# save memory
dict = {}
dict['w'] = j
dict['h'] = i
list.append(dict)
# save local file
f = temp_output_path + "{}-{}.png".format(j, i)
print("save split img =====> w : %s ,h : %s ,cur std_dev : %s,cur threshold : %s ".format(j, i,
std_dev,
threshold)) # 测试的像素区域,w:45-65--->com
# 可以不保存图片
# cv.imwrite(f, block)
return list
def get_mask(self, img_path, list, block_size, mask_img_path):
"""
获取mask
:param img_path:
:param list:
:param block_size:
:param mask_img_path:
:return:
"""
img = cv.imread(img_path, cv.IMREAD_COLOR)
# black color
img[:] = 0
for item in list:
w = int(item.get("w"))
h = int(item.get("h"))
x1, y1 = w, h # 左上角坐标
x2, y2 = w + block_size, h + block_size # 右下角坐标
# white color
img[y1:y2, x1:x2] = 255, 255, 255
# print(img[y1,x1])
# save
cv.imwrite(mask_img_path, img)
return img
|