def process(self, text_arr, bg_arr, min_h):
        """
        text_arr : one alpha mask : nxm, uint8
        bg_arr   : background image: nxmx3, uint8
        min_h    : height of the smallest character (px)

        return text_arr blit onto bg_arr.
        """
        # decide on a color for the text:
        l_text, fg_col, bg_col = self.color_text(text_arr, min_h, bg_arr)
        bg_col = np.mean(np.mean(bg_arr, axis=0), axis=0)
        l_bg = Layer(alpha=255 * np.ones_like(text_arr, 'uint8'), color=bg_col)

        l_text.alpha = l_text.alpha * np.clip(0.88 + 0.1 * np.random.randn(),
                                              0.72, 1.0)
        layers = [l_text]
        blends = []

        # add border:
        if np.random.rand() < self.p_border:
            if min_h <= 15: bsz = 1
            elif 15 < min_h < 30: bsz = 3
            else: bsz = 5
            border_a = self.border(l_text.alpha, size=bsz)
            l_border = Layer(border_a,
                             self.color_border(l_text.color, l_bg.color))
            layers.append(l_border)
            blends.append('normal')

        # add shadow:
        if np.random.rand() < self.p_drop_shadow:
            # shadow gaussian size:
            if min_h <= 15: bsz = 1
            elif 15 < min_h < 30: bsz = 3
            else: bsz = 5

            # shadow angle:
            theta = np.pi / 4 * np.random.choice([1, 3, 5, 7
                                                  ]) + 0.5 * np.random.randn()

            # shadow shift:
            if min_h <= 15: shift = 2
            elif 15 < min_h < 30: shift = 7 + np.random.randn()
            else: shift = 15 + 3 * np.random.randn()

            # opacity:
            op = 0.50 + 0.1 * np.random.randn()

            shadow = self.drop_shadow(l_text.alpha, theta, shift, 3 * bsz, op)
            l_shadow = Layer(shadow, 0)
            layers.append(l_shadow)
            blends.append('normal')

        l_bg = Layer(alpha=255 * np.ones_like(text_arr, 'uint8'), color=bg_col)
        layers.append(l_bg)
        blends.append('normal')
        l_normal = self.merge_down(layers, blends)
        # now do poisson image editing:
        l_bg = Layer(alpha=255 * np.ones_like(text_arr, 'uint8'), color=bg_arr)
        l_out = blit_images(l_normal.color, l_bg.color.copy())

        # plt.subplot(1,3,1)
        # plt.imshow(l_normal.color)
        # plt.subplot(1,3,2)
        # plt.imshow(l_bg.color)
        # plt.subplot(1,3,3)
        # plt.imshow(l_out)
        # plt.show()

        if l_out is None:
            # poisson recontruction produced
            # imperceptible text. In this case,
            # just do a normal blend:
            layers[-1] = l_bg
            return self.merge_down(layers, blends).color

        return l_out
    def process(self, text_arr, bg_arr, min_h):
        """
        text_arr : one alpha mask : nxm, uint8
        bg_arr   : background image: nxmx3, uint8
        min_h    : height of the smallest character (px)

        return text_arr blit onto bg_arr.
        """
        # decide on a color for the text:
        l_text, fg_col, bg_col = self.color_text(text_arr, min_h, bg_arr)
        bg_col = np.mean(np.mean(bg_arr,axis=0),axis=0)
        l_bg = Layer(alpha=255*np.ones_like(text_arr,'uint8'),color=bg_col)

        l_text.alpha = l_text.alpha * np.clip(0.88 + 0.1*np.random.randn(), 0.72, 1.0)
        layers = [l_text]
        blends = []

        # add border:
        if np.random.rand() < self.p_border:
            if min_h <= 15 : bsz = 1
            elif 15 < min_h < 30: bsz = 3
            else: bsz = 5
            border_a = self.border(l_text.alpha, size=bsz)
            l_border = Layer(border_a, self.color_border(l_text.color,l_bg.color))
            layers.append(l_border)
            blends.append('normal')

        # add shadow:
        if np.random.rand() < self.p_drop_shadow:
            # shadow gaussian size:
            if min_h <= 15 : bsz = 1
            elif 15 < min_h < 30: bsz = 3
            else: bsz = 5

            # shadow angle:
            theta = np.pi/4 * np.random.choice([1,3,5,7]) + 0.5*np.random.randn()

            # shadow shift:
            if min_h <= 15 : shift = 2
            elif 15 < min_h < 30: shift = 7+np.random.randn()
            else: shift = 15 + 3*np.random.randn()

            # opacity:
            op = 0.50 + 0.1*np.random.randn()

            shadow = self.drop_shadow(l_text.alpha, theta, shift, 3*bsz, op)
            l_shadow = Layer(shadow, 0)
            layers.append(l_shadow)
            blends.append('normal')
        

        l_bg = Layer(alpha=255*np.ones_like(text_arr,'uint8'), color=bg_col)
        layers.append(l_bg)
        blends.append('normal')
        l_normal = self.merge_down(layers,blends)
        # now do poisson image editing:
        l_bg = Layer(alpha=255*np.ones_like(text_arr,'uint8'), color=bg_arr)
        l_out =  blit_images(l_normal.color,l_bg.color.copy())
        
        # plt.subplot(1,3,1)
        # plt.imshow(l_normal.color)
        # plt.subplot(1,3,2)
        # plt.imshow(l_bg.color)
        # plt.subplot(1,3,3)
        # plt.imshow(l_out)
        # plt.show()
        
        if l_out is None:
            # poisson recontruction produced
            # imperceptible text. In this case,
            # just do a normal blend:
            layers[-1] = l_bg
            return self.merge_down(layers,blends).color

        return l_out
    def process(self, text_arr, bg_arr,light_map, min_h):
        """
        text_arr : one alpha mask : nxm, uint8
        bg_arr   : background image: nxmx3, uint8
        min_h    : height of the smallest character (px)

        return text_arr blit onto bg_arr.
        """
        # decide on a color for the text:
        l_text, fg_col, bg_col = self.color_text(text_arr, min_h, bg_arr)
        
        print(fg_col,bg_col)
        bg_col = np.mean(np.mean(bg_arr,axis=0),axis=0)
        l_bg = Layer(alpha=255*np.ones_like(text_arr,'uint8'),color=bg_col)

        l_text.alpha = l_text.alpha * np.clip(0.92 + 0.1*np.random.randn(), 0.72, 1.0)
        #print(np.max(l_text.alpha))
        layers = [l_text]
        blends = []

        # add border:
        if np.random.rand() < self.p_border:
            if min_h <= 15 : bsz = 1
            elif 15 < min_h < 30: bsz = 3
            else: bsz = 5
            border_a = self.border(l_text.alpha, size=bsz)
            l_border = Layer(border_a, self.color_border(l_text.color,l_bg.color))
            layers.append(l_border)
            blends.append('normal')

        # add shadow:
        if np.random.rand() < self.p_drop_shadow:
            # shadow gaussian size:
            if min_h <= 15 : bsz = 1
            elif 15 < min_h < 30: bsz = 3
            else: bsz = 5

            # shadow angle:
            theta = np.pi/4 * np.random.choice([1,3,5,7]) + 0.5*np.random.randn()

            # shadow shift:
            if min_h <= 15 : shift = 2
            elif 15 < min_h < 30: shift = 7+np.random.randn()
            else: shift = 15 + 3*np.random.randn()

            # opacity:
            op = 0.50 + 0.1*np.random.randn()

            shadow = self.drop_shadow(l_text.alpha, theta, shift, 3*bsz, op)
            l_shadow = Layer(shadow, 0)
            layers.append(l_shadow)
            blends.append('normal')
        

        l_bg = Layer(alpha=255*np.ones_like(text_arr,'uint8'), color=bg_col)
        layers.append(l_bg)
        blends.append('normal')
        l_normal = self.merge_down(layers,blends)
        # now do poisson image editing:
        l_bg = Layer(alpha=255*np.ones_like(text_arr,'uint8'), color=bg_arr)
        #print(text_arr.shape)
        #txt = np.concatenate((l_normal.color, l_normal.alpha.reshape(l_normal.alpha.shape[0],l_normal.alpha.shape[1],1)),axis=2)
        #txt = l_bg.color[text_arr]
        
        l_out =  blit_images(l_normal.color,l_bg.color.copy())
        #l_out = l_out[text_arr]
        
        # plt.subplot(1,3,1)
        # plt.imshow(l_normal.color)
        # plt.subplot(1,3,2)
        # plt.imshow(l_bg.color)
        # plt.subplot(1,3,3)
        # plt.imshow(l_out)
        # plt.show()
        
        if l_out is None:
            # poisson recontruction produced
            # imperceptible text. In this case,
            # just do a normal blend:
            layers[-1] = l_bg
            return self.merge_down(layers,blends).color
        '''for i in range(l_out.shape[0]):
            for j in range(l_out.shape[1]):
                l_out[i][j][:] = (text_arr[i][j] > 0)*l_out[i][j][:]'''
        #l_out = np.concatenate((l_out, (255*text_arr).reshape(text_arr.shape[0],text_arr.shape[1],1)),axis=-1)
        #l_out = np.concatenate((l_out, (text_arr.shape[0],text_arr.shape[1],1)),axis=-1)
        
        l_out_4d = np.zeros((l_out.shape[0], l_out.shape[1],4))
        l_out_4d[:,:,:3]= l_out
        l_out_4d[:,:,3] = text_arr#255*np.ones((l_out.shape[0], l_out.shape[1]))#text_arr
        cv.imwrite("test.png",l_out_4d)
        #l_out_4d /= 255
        plt.imshow(cv.cvtColor(bg_arr,cv.COLOR_BGR2RGB))
        plt.show()
        plt.imshow(text_arr, cmap='binary')
        plt.show()
        plt.imshow(l_out_4d/255)
        plt.title("l_out_4d")
        plt.show()
        return l_out_4d
Beispiel #4
0
    def process(self, text_arr, bg_arr, min_h):
        """
        text_arr : one alpha mask : nxm, uint8
        bg_arr   : background image: nxmx3, uint8
        min_h    : height of the smallest character (px)

        return text_arr blit onto bg_arr.

        text_arr: одна альфа-маска: nxm, uint8
        bg_arr: фоновое изображение: nxmx3, uint8
        min_h: высота самого маленького символа (px)

        вернуть text_arr blit на bg_arr.
        """
        # decide on a color for the text:
        # выбрать цвет для текста:
        l_text, fg_col, bg_col = self.color_text(text_arr, min_h, bg_arr)
        bg_col = np.mean(np.mean(bg_arr, axis=0), axis=0)
        l_bg = Layer(alpha=255 * np.ones_like(text_arr, 'uint8'), color=bg_col)

        l_text.alpha = l_text.alpha * np.clip(0.88 + 0.1 * np.random.randn(),
                                              0.72, 1.0)
        layers = [l_text]
        blends = []

        # add border:
        # добавить границу:
        if np.random.rand() < self.p_border:
            if min_h <= 15: bsz = 1
            elif 15 < min_h < 30: bsz = 3
            else: bsz = 5
            border_a = self.border(l_text.alpha, size=bsz)
            l_border = Layer(border_a,
                             self.color_border(l_text.color, l_bg.color))
            layers.append(l_border)
            blends.append('normal')

        # add shadow:
        # добавить тень:
        if np.random.rand() < self.p_drop_shadow:
            # shadow gaussian size:
            # теневой размер по Гауссу:
            if min_h <= 15: bsz = 1
            elif 15 < min_h < 30: bsz = 3
            else: bsz = 5

            # shadow angle:
            # угол тени:
            theta = np.pi / 4 * np.random.choice([1, 3, 5, 7
                                                  ]) + 0.5 * np.random.randn()

            # shadow shift:
            # теневой сдвиг:
            if min_h <= 15: shift = 2
            elif 15 < min_h < 30: shift = 7 + np.random.randn()
            else: shift = 15 + 3 * np.random.randn()

            # opacity:
            # непрозрачность:
            op = 0.50 + 0.1 * np.random.randn()

            shadow = self.drop_shadow(l_text.alpha, theta, shift, 3 * bsz, op)
            l_shadow = Layer(shadow, 0)
            layers.append(l_shadow)
            blends.append('normal')

        l_bg = Layer(alpha=255 * np.ones_like(text_arr, 'uint8'), color=bg_col)
        layers.append(l_bg)
        blends.append('normal')
        l_normal = self.merge_down(layers, blends)
        # now do poisson image editing:
        # теперь выполняем редактирование пуассоновских изображений:
        l_bg = Layer(alpha=255 * np.ones_like(text_arr, 'uint8'), color=bg_arr)
        l_out = blit_images(l_normal.color, l_bg.color.copy())

        # plt.subplot(1,3,1)
        # plt.imshow(l_normal.color)
        # plt.subplot(1,3,2)
        # plt.imshow(l_bg.color)
        # plt.subplot(1,3,3)
        # plt.imshow(l_out)
        # plt.show()

        if l_out is None:
            # poisson recontruction produced
            # imperceptible text. In this case,
            # just do a normal blend:
            # Пуассоново восстановление произведено # незаметный текст. В этом случае,
            # просто сделайте нормальное смешивание:
            layers[-1] = l_bg
            return self.merge_down(layers, blends).color

        return l_out