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