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