Serg4451D commited on
Commit
01b2369
·
verified ·
1 Parent(s): ca0a7fb

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -65
app.py CHANGED
@@ -1,90 +1,70 @@
1
  import gradio as gr
2
  import cv2
3
  import numpy as np
4
- from PIL import Image, ImageEnhance
5
 
6
- def compress_and_enhance(img, mode, denoise_strength):
7
  """
8
- Сжимает изображение, уменьшая его в 2 раза по ширине, высоте или обоим измерениям,
9
- затем увеличивает обратно с помощью интерполяции Ланцоша, применяет
10
- агрессивное шумоподавление и корректирует насыщенность.
11
 
12
  Args:
13
- img: Изображение в формате PIL Image.
14
- mode: Режим сжатия ("Width", "Height", "Both").
15
- denoise_strength: Сила шумоподавления (от 0 до 10, где 0 - нет шумоподавления, 10 - максимальное).
16
 
17
  Returns:
18
- Обработанное изображение в формате PIL Image.
19
  """
20
- img = np.array(img)
21
- original_height, original_width = img.shape[:2]
22
 
23
- if mode == "Width":
24
- # Уменьшение по ширине
25
- small_img = cv2.resize(img, (original_width // 2, original_height), interpolation=cv2.INTER_AREA)
26
- # Увеличение обратно по ширине
27
- resized_img = cv2.resize(small_img, (original_width, original_height), interpolation=cv2.INTER_LANCZOS4)
28
- elif mode == "Height":
29
- # Уменьшение по высоте
30
- small_img = cv2.resize(img, (original_width, original_height // 2), interpolation=cv2.INTER_AREA)
31
- # Увеличение обратно по высоте
32
- resized_img = cv2.resize(small_img, (original_width, original_height), interpolation=cv2.INTER_LANCZOS4)
33
- elif mode == "Both":
34
- # Уменьшение в 2 раза
35
- small_img = cv2.resize(img, (original_width // 2, original_height // 2), interpolation=cv2.INTER_AREA)
36
- # Увеличение обратно
37
- resized_img = cv2.resize(small_img, (original_width, original_height), interpolation=cv2.INTER_LANCZOS4)
38
- else:
39
- resized_img = img
40
 
41
- # Агрессивное шумоподавление (Non-Local Means Denoising)
42
- if denoise_strength > 0:
43
- # h values from 3 (very low) to 10 (very high)
44
- denoised_img = cv2.fastNlMeansDenoisingColored(resized_img, None, h=denoise_strength, templateWindowSize=7, searchWindowSize=21)
45
- else:
46
- denoised_img = resized_img
47
 
48
- # Нерезкое маскирование (Unsharp Masking)
49
- blurred = cv2.GaussianBlur(denoised_img, (0, 0), 3)
50
- sharpened = cv2.addWeighted(denoised_img, 1.5, blurred, -0.5, 0)
 
 
 
 
51
 
52
- # Коррекция насыщенности
53
- pil_img = Image.fromarray(sharpened)
54
- enhancer = ImageEnhance.Color(pil_img)
55
- enhanced_img = enhancer.enhance(1.2) # Увеличение насыщенности на 20%
56
 
57
- return enhanced_img
 
 
 
58
 
59
- def process_image(img, mode, denoise_strength):
60
- """
61
- Обрабатывает изображение.
62
 
63
- Args:
64
- img: Изображение.
65
- mode: Режим сжатия.
66
- denoise_strength: Сила шумоподавления.
67
 
68
- Returns:
69
- Обработанное изображение в формате PIL Image или None.
70
- """
71
- if img is not None:
72
- pil_img = Image.fromarray(img.astype('uint8'), 'RGB')
73
- return compress_and_enhance(pil_img, mode, denoise_strength)
74
- else:
75
- return None
76
 
77
- # Интерфейс Gradio
78
  iface = gr.Interface(
79
- fn=process_image,
80
  inputs=[
81
- gr.Image(type="numpy", label="Upload Image"),
82
- gr.Radio(choices=["Width", "Height", "Both"], label="Compression Mode", value="Both"),
83
- gr.Slider(minimum=0, maximum=10, step=1, label="Denoise Strength", value=0)
84
  ],
85
- outputs=gr.Image(type="pil", label="Processed Image"),
86
- title="Image Compression and Enhancement",
87
- description="Compresses an image, applies aggressive denoising, and enhances saturation. Adjust the denoise strength for smoother results.",
88
  )
89
 
90
  iface.launch()
 
1
  import gradio as gr
2
  import cv2
3
  import numpy as np
 
4
 
5
+ def resize_and_stretch(video_path, direction):
6
  """
7
+ Уменьшает видео по горизонтали или вертикали на 25%, а затем растягивает обратно с помощью интерполяции Ланцоша.
 
 
8
 
9
  Args:
10
+ video_path: Путь к видеофайлу.
11
+ direction: Направление сжатия ("horizontal" или "vertical").
 
12
 
13
  Returns:
14
+ Путь к обработанному видеофайлу.
15
  """
 
 
16
 
17
+ cap = cv2.VideoCapture(video_path)
18
+ if not cap.isOpened():
19
+ raise ValueError("Не удалось открыть видеофайл.")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
 
21
+ # Получаем свойства видео
22
+ fps = cap.get(cv2.CAP_PROP_FPS)
23
+ width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
24
+ height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
 
 
25
 
26
+ # Вычисляем новые размеры
27
+ if direction == "horizontal":
28
+ new_width = int(width * 0.75)
29
+ new_height = height
30
+ else: # vertical
31
+ new_width = width
32
+ new_height = int(height * 0.75)
33
 
34
+ # Создаем объект VideoWriter для записи выходного видео
35
+ fourcc = cv2.VideoWriter_fourcc(*'mp4v') # Или используйте другой кодек, если нужно
36
+ output_path = "output_video.mp4"
37
+ out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))
38
 
39
+ while True:
40
+ ret, frame = cap.read()
41
+ if not ret:
42
+ break
43
 
44
+ # Уменьшаем размер кадра
45
+ resized_frame = cv2.resize(frame, (new_width, new_height), interpolation=cv2.INTER_LANCZOS4)
 
46
 
47
+ # Растягиваем обратно с помощью интерполяции Ланцоша
48
+ stretched_frame = cv2.resize(resized_frame, (width, height), interpolation=cv2.INTER_LANCZOS4)
 
 
49
 
50
+ # Записываем кадр в выходное видео
51
+ out.write(stretched_frame)
52
+
53
+ cap.release()
54
+ out.release()
55
+
56
+ return output_path
 
57
 
58
+ # Создаем интерфейс Gradio
59
  iface = gr.Interface(
60
+ fn=resize_and_stretch,
61
  inputs=[
62
+ gr.Video(label="Загрузите видео"),
63
+ gr.Radio(["horizontal", "vertical"], label="Направление сжатия")
 
64
  ],
65
+ outputs=gr.Video(label="Обработанное видео"),
66
+ title="Сжатие и растягивание видео",
67
+ description="Загрузите видео, выберите направление сжатия (горизонтальное или вертикальное), и программа уменьшит его размер на 25% в этом направлении, а затем растянет обратно с помощью интерполяции Ланцоша."
68
  )
69
 
70
  iface.launch()