DHEIVER commited on
Commit
5fc7808
·
verified ·
1 Parent(s): 2383d5c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +147 -59
app.py CHANGED
@@ -1,93 +1,181 @@
1
  import gradio as gr
2
  import cv2
3
  import numpy as np
 
 
4
  from PIL import Image
5
- import io
 
 
 
6
 
7
- def process_image(input_image, threshold_value, kernel_size):
8
- # Converter para array numpy
9
- img = np.array(input_image)
10
-
11
- # Converter para escala de cinza
12
- gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
13
-
14
- # Aplicar threshold adaptativo
15
- thresh = cv2.adaptiveThreshold(
16
- gray,
17
- 255,
18
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
19
- cv2.THRESH_BINARY_INV,
20
- threshold_value,
21
- 2
22
- )
23
-
24
- # Criar kernel para operações morfológicas
25
- kernel = np.ones((kernel_size, kernel_size), np.uint8)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
- # Aplicar operações morfológicas
28
- opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
29
- closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
 
31
- # Encontrar contornos da marca d'água
32
- contours, _ = cv2.findContours(closing, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
33
 
34
- # Criar máscara para inpainting
35
- mask = np.zeros_like(gray)
36
- for cnt in contours:
37
- cv2.drawContours(mask, [cnt], -1, (255,255,255), -1)
38
 
39
- # Realizar inpainting
40
- result = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
 
41
 
42
  return result, mask
43
 
44
- # Interface Gradio
45
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
46
- gr.Markdown("# Removedor de Marca D'água")
 
 
 
47
 
48
  with gr.Row():
49
  with gr.Column():
50
  input_image = gr.Image(label="Imagem Original", type="numpy")
51
- threshold_slider = gr.Slider(
52
- minimum=3,
53
- maximum=101,
54
- step=2,
55
- value=11,
56
- label="Valor do Threshold"
57
  )
58
- kernel_slider = gr.Slider(
59
- minimum=1,
60
- maximum=9,
61
- step=2,
62
- value=3,
63
- label="Tamanho do Kernel"
64
  )
65
- process_btn = gr.Button("Processar Imagem")
66
 
67
  with gr.Column():
68
  output_image = gr.Image(label="Imagem Processada")
69
- mask_image = gr.Image(label="Máscara Detectada")
 
70
 
71
  # Eventos
72
  process_btn.click(
73
  fn=process_image,
74
- inputs=[input_image, threshold_slider, kernel_slider],
75
  outputs=[output_image, mask_image]
76
  )
77
 
78
  gr.Markdown("""
79
- ## Como usar:
80
- 1. Faça upload de uma imagem com marca d'água
81
- 2. Ajuste os parâmetros:
82
- - Valor do Threshold: Controla a sensibilidade da detecção
83
- - Tamanho do Kernel: Afeta o tamanho da área de processamento
84
- 3. Clique em "Processar Imagem"
85
- 4. Visualize o resultado e a máscara detectada
86
 
87
- ## Observações:
88
- - O resultado pode variar dependendo do tipo e complexidade da marca d'água
89
- - Ajuste os parâmetros para obter melhores resultados
90
- - A máscara mostra as áreas detectadas como marca d'água
91
  """)
92
 
93
  if __name__ == "__main__":
 
1
  import gradio as gr
2
  import cv2
3
  import numpy as np
4
+ import torch
5
+ import torch.nn as nn
6
  from PIL import Image
7
+ import torchvision.transforms as transforms
8
+ from skimage import restoration
9
+ import warnings
10
+ warnings.filterwarnings('ignore')
11
 
12
+ class WatermarkRemovalNet(nn.Module):
13
+ def __init__(self):
14
+ super(WatermarkRemovalNet, self).__init__()
15
+ # Encoder
16
+ self.encoder = nn.Sequential(
17
+ nn.Conv2d(3, 64, 3, padding=1),
18
+ nn.ReLU(inplace=True),
19
+ nn.Conv2d(64, 64, 3, padding=1),
20
+ nn.ReLU(inplace=True),
21
+ nn.MaxPool2d(2, 2),
22
+
23
+ nn.Conv2d(64, 128, 3, padding=1),
24
+ nn.ReLU(inplace=True),
25
+ nn.Conv2d(128, 128, 3, padding=1),
26
+ nn.ReLU(inplace=True),
27
+ nn.MaxPool2d(2, 2),
28
+
29
+ nn.Conv2d(128, 256, 3, padding=1),
30
+ nn.ReLU(inplace=True),
31
+ nn.Conv2d(256, 256, 3, padding=1),
32
+ nn.ReLU(inplace=True),
33
+ )
34
+
35
+ # Decoder
36
+ self.decoder = nn.Sequential(
37
+ nn.ConvTranspose2d(256, 128, 2, stride=2),
38
+ nn.ReLU(inplace=True),
39
+ nn.Conv2d(128, 128, 3, padding=1),
40
+ nn.ReLU(inplace=True),
41
+
42
+ nn.ConvTranspose2d(128, 64, 2, stride=2),
43
+ nn.ReLU(inplace=True),
44
+ nn.Conv2d(64, 64, 3, padding=1),
45
+ nn.ReLU(inplace=True),
46
+
47
+ nn.Conv2d(64, 3, 3, padding=1),
48
+ nn.Sigmoid()
49
+ )
50
+
51
+ def forward(self, x):
52
+ x = self.encoder(x)
53
+ x = self.decoder(x)
54
+ return x
55
+
56
+ class WatermarkRemover:
57
+ def __init__(self):
58
+ self.device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
59
+ self.model = WatermarkRemovalNet().to(self.device)
60
+ self.transform = transforms.Compose([
61
+ transforms.ToTensor(),
62
+ ])
63
+
64
+ def preprocess_image(self, image):
65
+ if isinstance(image, np.ndarray):
66
+ image = Image.fromarray(image)
67
+ return self.transform(image).unsqueeze(0)
68
 
69
+ def detect_watermark(self, img):
70
+ gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
71
+ denoised = cv2.fastNlMeansDenoising(gray)
72
+
73
+ # Multi-scale watermark detection
74
+ scales = [1.0, 0.5, 2.0]
75
+ masks = []
76
+
77
+ for scale in scales:
78
+ scaled = cv2.resize(denoised, None, fx=scale, fy=scale)
79
+ thresh = cv2.adaptiveThreshold(
80
+ scaled, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
81
+ cv2.THRESH_BINARY_INV, 11, 2
82
+ )
83
+
84
+ kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
85
+ mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
86
+
87
+ if scale != 1.0:
88
+ mask = cv2.resize(mask, (denoised.shape[1], denoised.shape[0]))
89
+
90
+ masks.append(mask)
91
+
92
+ # Combine masks
93
+ final_mask = np.zeros_like(denoised)
94
+ for mask in masks:
95
+ final_mask = cv2.bitwise_or(final_mask, mask)
96
+
97
+ return final_mask
98
+
99
+ def remove_watermark(self, img, mask, strength=0.8):
100
+ # Apply inpainting
101
+ inpainted = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
102
+
103
+ # Apply deep learning model
104
+ tensor_img = self.preprocess_image(inpainted).to(self.device)
105
+ with torch.no_grad():
106
+ output = self.model(tensor_img)
107
+ dl_result = output.squeeze(0).cpu().numpy().transpose(1, 2, 0)
108
+
109
+ # Apply image restoration
110
+ denoise_img = restoration.denoise_tv_chambolle(dl_result, weight=0.1)
111
+ enhanced = cv2.detailEnhance(denoise_img.astype(np.float32), sigma_s=10, sigma_r=0.15)
112
+
113
+ # Blend results
114
+ result = cv2.addWeighted(enhanced, strength, img.astype(np.float32)/255, 1-strength, 0)
115
+ return (result * 255).astype(np.uint8)
116
+
117
+ def process_image(input_image, strength, enhance_details):
118
+ remover = WatermarkRemover()
119
 
120
+ # Detect watermark
121
+ mask = remover.detect_watermark(input_image)
122
 
123
+ # Remove watermark
124
+ result = remover.remove_watermark(input_image, mask, strength)
 
 
125
 
126
+ # Optional detail enhancement
127
+ if enhance_details:
128
+ result = cv2.detailEnhance(result, sigma_s=10, sigma_r=0.15)
129
 
130
  return result, mask
131
 
132
+ # Gradio Interface
133
  with gr.Blocks(theme=gr.themes.Soft()) as demo:
134
+ gr.Markdown("""
135
+ # Removedor Avançado de Marca D'água
136
+ Este aplicativo utiliza uma combinação de deep learning e processamento de imagem para remover marcas d'água.
137
+ """)
138
 
139
  with gr.Row():
140
  with gr.Column():
141
  input_image = gr.Image(label="Imagem Original", type="numpy")
142
+ strength_slider = gr.Slider(
143
+ minimum=0.1,
144
+ maximum=1.0,
145
+ value=0.8,
146
+ step=0.1,
147
+ label="Intensidade da Remoção"
148
  )
149
+ enhance_checkbox = gr.Checkbox(
150
+ label="Melhorar Detalhes",
151
+ value=True
 
 
 
152
  )
153
+ process_btn = gr.Button("Processar Imagem", variant="primary")
154
 
155
  with gr.Column():
156
  output_image = gr.Image(label="Imagem Processada")
157
+ mask_image = gr.Image(label="Máscara de Marca D'água")
158
+
159
 
160
  # Eventos
161
  process_btn.click(
162
  fn=process_image,
163
+ inputs=[input_image, strength_slider, enhance_checkbox],
164
  outputs=[output_image, mask_image]
165
  )
166
 
167
  gr.Markdown("""
168
+ ## Recursos Avançados:
169
+ - Detecção multi-escala de marca d'água
170
+ - Modelo de deep learning para reconstrução de imagem
171
+ - Restauração avançada de imagem
172
+ - Preservação de detalhes
173
+ - Controle de intensidade ajustável
 
174
 
175
+ ## Dicas de Uso:
176
+ 1. Ajuste a 'Intensidade da Remoção' para controlar o balanço entre remoção da marca e preservação da imagem
177
+ 2. Ative 'Melhorar Detalhes' para realçar a qualidade da imagem final
178
+ 3. Visualize a máscara para entender quais áreas estão sendo processadas
179
  """)
180
 
181
  if __name__ == "__main__":