基于边缘检测算法检测视频中文字
Published in:2025-01-10 |
Words: 5.3k | Reading time: 20min | reading:

基于边缘检测算法检测视频中文字

思路

核心挑战:

  • 动态变化: 字幕的位置、大小、颜色、字体、背景等都会动态变化。
  • 复杂背景: 字幕通常叠加在复杂的视频背景上。
  • 时间连贯性: 字幕通常在一段时间内持续出现,并非只出现一帧。
  • 精度要求: 要尽可能准确地检测到字幕区域,避免误检或漏检。

基本思路:

  1. 帧预处理:

    • 灰度化: 将视频帧转换为灰度图,减少颜色干扰。
    • 降噪: 对帧进行降噪处理,提高检测的准确性。
  2. 字幕区域检测:

    • 边缘检测: 使用 Canny 边缘检测算法,提取视频帧中的边缘信息。字幕通常有清晰的边缘。
    • 文本特征提取: 通过文本的特征(如纹理、颜色、形状)来识别字幕区域。
    • 连通域分析: 通过连通域分析,找到连续的边缘区域,字幕通常会形成连通的区域。
    • 深度学习: 使用训练好的文字检测模型,检测字幕区域。
  3. 字幕区域验证:

    • 大小判断: 字幕通常有一定的大小范围,可以排除过大或过小的区域。
    • 位置判断: 字幕通常位于视频的下方或者上方,可以排除在中间或边缘的区域。
    • 时序分析: 字幕通常在一段时间内持续出现,分析前后帧的字幕区域,验证是否为真实字幕。
    • OCR识别: 使用OCR识别技术对检测区域进行识别,若能识别出文字,则认为是字幕区域。
  4. 提取字幕帧:

    • 将检测到字幕的帧单独保存到一个文件夹中。

技术

  • opencv
  • easyocr

实现

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
# _*_ coding: utf-8 _*_
"""
Time: 2025/1/3 10:37
Author: ZhaoQi Cao(czq)
Version: V 0.1
File: lan_detect_cal_new.py
Describe: Write during the python at zgxmt, Github link: https://github.com/caozhaoqi
"""
import cv2
import numpy as np
import os
import shutil
import logging
import easyocr
import threading
from tqdm import tqdm
import time
import tempfile
import psutil

logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 使用GPU 加速
reader = easyocr.Reader(['ch_sim','en'], gpu=True)

def detect_subtitle_area(frame, min_area=100, max_area = 1000,threshold1 = 100, threshold2 = 200):
"""检测字幕区域"""
try:
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)

edges = cv2.Canny(blurred, threshold1, threshold2)
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
subtitle_areas = []
for contour in contours:
area = cv2.contourArea(contour)
x, y, w, h = cv2.boundingRect(contour)
if min_area < area < max_area:
subtitle_areas.append((x, y, w, h))
return subtitle_areas
except Exception as e:
logging.error(f"检测字幕区域失败 {e}")
return []

def ocr_check(frame, subtitle_area):
"""ocr检测是否有字幕"""
x,y,w,h = subtitle_area
roi = frame[y:y+h, x:x+w]
result = reader.readtext(roi)
if result:
return True
else:
return False

def process_video(video_path, output_dir, min_area=100, max_area=1000, threshold1=100, threshold2=200, move_file=False, max_retries = 3, retry_delay = 5, min_subtitle_frames = 5):
"""处理单个视频"""
logging.info(f"开始处理视频:{video_path}")
temp_video_path = None # 用于临时文件
try:
if move_file:
temp_dir = tempfile.mkdtemp()
temp_video_path = os.path.join(temp_dir, os.path.basename(video_path))
shutil.copy2(video_path, temp_video_path) # 使用copy2 保存元数据,避免移动文件
video_path = temp_video_path
cap = cv2.VideoCapture(video_path)
if not cap.isOpened():
logging.error(f"无法打开视频文件:{video_path}")
return False

if not os.path.exists(output_dir):
os.makedirs(output_dir)
frame_count = 0
subtitle_frame_count = 0
while True:
ret, frame = cap.read()
if not ret:
break
subtitle_areas = detect_subtitle_area(frame, min_area, max_area, threshold1, threshold2)
for subtitle_area in subtitle_areas:
if ocr_check(frame, subtitle_area):
subtitle_frame_count += 1
frame_count += 1
logging.info(f"正在处理第{frame_count}帧")
logging.info(f"共检测到{subtitle_frame_count}张字幕图片")
cap.release()
has_subtitle = subtitle_frame_count > min_subtitle_frames # 至少需要min_subtitle_frames帧包含字幕

if has_subtitle and move_file:
output_file = os.path.join(output_dir, os.path.basename(video_path))
for attempt in range(max_retries):
try:
shutil.move(video_path, output_file)
logging.info(f"移动文件到: {output_file}")
break
except Exception as e:
logging.error(f"移动文件 {video_path} 失败:{e},尝试重新移动 {attempt+1} 次")
time.sleep(retry_delay)
else:
logging.error(f"尝试多次移动文件 {video_path} 失败,请检查是否有进程正在使用该文件")
return False

return True
elif has_subtitle:
logging.info(f"当前视频有字幕: {video_path}")
return True
else:
logging.info(f"当前视频没有字幕: {video_path}")
return False
except Exception as e:
logging.error(f"处理视频过程失败:{e}")
return False
finally:
if temp_video_path and os.path.exists(temp_video_path):
shutil.rmtree(os.path.dirname(temp_video_path), ignore_errors = True)
logging.info(f"清理临时文件 {temp_video_path} 完成")
logging.info(f"视频处理完成:{video_path}")

def process_video_threaded(video_path, output_dir, min_area=100, max_area=1000, threshold1=100, threshold2=200, move_file = False, max_retries = 3, retry_delay = 5, min_subtitle_frames = 5):
"""多线程处理视频"""
try:
start_time = time.time()
result = process_video(video_path, output_dir, min_area, max_area, threshold1, threshold2, move_file, max_retries, retry_delay, min_subtitle_frames)
end_time = time.time()
cpu_percent = psutil.cpu_percent() # 获取cpu使用率
logging.info(f"视频:{video_path}, 耗时:{end_time - start_time:.2f} 秒, CPU 利用率:{cpu_percent:.2f}%")
return result

except Exception as e:
logging.error(f"处理视频 {video_path} 失败:{e}")
return False


def process_directory_multithreaded(input_dir, output_dir, min_area=100, max_area=1000, threshold1=100, threshold2=200, allowed_extensions=('.mp4', '.avi', '.mov', '.mkv'), num_threads = 4, move_file = False, max_retries = 3, retry_delay = 5, min_subtitle_frames = 5):
"""多线程处理指定目录下所有视频"""
if not os.path.isdir(input_dir):
logging.error(f"错误:输入的不是目录: {input_dir}")
return

video_files = []
for root, _, files in os.walk(input_dir):
for filename in files:
if filename.lower().endswith(allowed_extensions):
video_files.append(os.path.join(root, filename))

with tqdm(total=len(video_files), desc="处理视频", unit="video") as pbar:
threads = []
for video_path in video_files:
relative_path = os.path.relpath(video_path, input_dir)
output_subdir = os.path.join(output_dir, os.path.splitext(relative_path)[0])
thread = threading.Thread(target=process_video_threaded, args=(video_path, output_subdir, min_area, max_area, threshold1, threshold2, move_file, max_retries, retry_delay, min_subtitle_frames))
threads.append(thread)
thread.start()
if len(threads) >= num_threads: # 控制线程数量
for thread in threads:
thread.join()
threads = []
pbar.update(1)

for thread in threads:
thread.join()

if __name__ == "__main__":
input_dir = r'E:\测试' # 替换为你的视频文件根目录路径
output_dir = r"E:\测试\subtitle_videos" # 替换为你的字幕视频输出路径
min_area = 100 # 可选参数,最小连通域面积
max_area = 1000 # 可选参数,最大连通域面积
threshold1 = 100 # 可选参数, canny边缘检测的阈值
threshold2 = 200 # 可选参数, canny边缘检测的阈值
num_threads = 4 # 可选参数, 线程数
move_file = True # 是否移动文件
max_retries = 3 # 最大重试次数
retry_delay = 5 # 重试间隔时间
min_subtitle_frames = 5 # 最小字幕帧数

process_directory_multithreaded(input_dir, output_dir, min_area, max_area, threshold1, threshold2, num_threads= num_threads, move_file=move_file, max_retries=max_retries, retry_delay=retry_delay, min_subtitle_frames=min_subtitle_frames)

tips

参数解释与建议值:

  1. min_area = 100 (可选参数,最小连通域面积)

    • 含义: 这个参数表示在检测字幕区域时,被认为是有效字幕区域的最小连通域面积。连通域是指图像中像素值相近且相互连接的区域。
    • 单位: 像素 (pixels)。
    • 作用: 用于过滤掉过小的噪声或干扰区域,这些区域通常不是真实的字幕。
    • 建议值:
      • 默认值: 100 是一个比较常用的起始值,适用于字幕字体大小适中的情况。
      • 调整方向:
        • 如果检测到太多噪声: 可以适当增大 min_area 的值,例如 150200
        • 如果漏检了小字幕: 可以适当减小 min_area 的值,例如 5080
      • 具体调整:
        • 你需要根据视频的分辨率和字幕字体大小进行调整, 如果你的视频是高清的,字幕字体比较大,则可以设置更大,反之则减小。
        • 可以先尝试不修改,运行代码查看日志或者输出的图片,再根据结果进行调整。
    • 注意事项:
      • min_area 的值不应设置得太小,否则会把一些小的噪点错误识别为字幕。
  2. max_area = 1000 (可选参数,最大连通域面积)

    • 含义: 这个参数表示在检测字幕区域时,被认为是有效字幕区域的最大连通域面积。
    • 单位: 像素 (pixels)。
    • 作用: 用于过滤掉过大的区域,例如背景或其他的文本区域。
    • 建议值:
      • 默认值: 1000 是一个比较常用的起始值,适用于字幕字体大小适中的情况。
      • 调整方向:
        • 如果检测到过大的区域: 可以适当减小 max_area 的值,例如 800900
        • 如果漏检了字幕: 如果你的字幕字体非常大,或者包含多个连通区域, 可以尝试增加 max_area 例如 1500
      • 具体调整:
        • 你需要根据视频的分辨率和字幕字体大小进行调整, 如果你的视频是高清的,字幕字体比较大,则可以设置更大,反之则减小。
        • 可以先尝试不修改,运行代码查看日志或者输出的图片,再根据结果进行调整。
    • 注意事项:
      • max_area 的值不应设置的太高,否则会将一些背景中的文字误认为是字幕。
  3. threshold1 = 100 (可选参数,Canny 边缘检测的阈值 1)

    • 含义: Canny 边缘检测算法有两个阈值,threshold1 是较低的阈值。
    • 单位: 无单位,表示像素值变化的大小。
    • 作用: 用于检测图像中的边缘。较低的阈值将检测出更多的边缘,可能包括一些噪声。
    • 建议值:
      • 默认值: 100 是一个比较常用的起始值。
      • 调整方向:
        • 如果检测到太多不必要的边缘: 可以适当增大 threshold1 的值,例如 120150
        • 如果漏检了字幕的边缘: 可以适当减小 threshold1 的值,例如 8090
      • 具体调整:
        • 需要根据视频的图像质量进行调整,如果视频比较模糊,则可以适当降低threshold1的值,提高检测的敏感性,反之则可以增加threshold1
        • 可以先尝试不修改,运行代码查看日志或者输出的图片,再根据结果进行调整。
  4. threshold2 = 200 (可选参数,Canny 边缘检测的阈值 2)

    • 含义: threshold2 是 Canny 边缘检测算法中较高的阈值。
    • 单位: 无单位,表示像素值变化的大小。
    • 作用: 较高阈值用于过滤掉弱边缘,确保只留下较强的边缘。
    • 建议值:
      • 默认值: 200 是一个比较常用的起始值。
      • 调整方向:
        • 如果检测到太多不必要的边缘: 可以适当增大 threshold2 的值,例如 220250
        • 如果漏检了字幕的边缘: 可以适当减小 threshold2 的值,例如 180190
      • 具体调整:
        • threshold2的值需要高于threshold1的值, 你可以根据视频的图像质量进行调整,如果视频比较模糊,则可以适当降低threshold2的值,提高检测的敏感性,反之则可以增加threshold2
        • 可以先尝试不修改,运行代码查看日志或者输出的图片,再根据结果进行调整。
    • 注意事项:
      • threshold2 的值不应与 threshold1 相差过大,否则边缘检测可能会失败。
  5. num_threads = 4 (可选参数,线程数)

    • 含义: 用于指定多线程处理视频时使用的线程数量。
    • 单位: 线程数。
    • 作用: 多线程可以提高视频处理速度,充分利用 CPU 资源。
    • 建议值:
      • 默认值: 4 是一个比较常用的起始值,适用于大多数 4 核或 8 核 CPU。
      • 调整方向:
        • 如果你的 CPU 核心数较少: 可以适当减小 num_threads 的值,例如 2
        • 如果你的 CPU 核心数较多,且资源充足: 可以适当增加 num_threads 的值,例如 816
      • 具体调整:
        • 你需要根据你的CPU的性能进行调整,如果CPU性能比较强,可以适当提高,否则则可以降低。
        • 如果多线程处理导致内存占用过多,可以考虑降低线程数量。
    • 注意事项:
      • num_threads 不应超过你 CPU 的核心数,过多的线程可能会导致性能下降,资源占用过多。
  6. move_file = True (可选参数,是否移动文件)

    • 含义: 一个布尔值,决定是否将检测到字幕的视频文件移动到输出文件夹。
    • 取值: True (移动文件) 或 False (不移动文件)。
    • 作用:
      • True: 将检测到字幕的视频文件移动到输出文件夹。
      • False: 只检测视频中是否有字幕,不移动视频文件。
    • 建议值:
      • 根据你的需求选择: 如果你需要整理有字幕的视频文件,设置为 True;如果只需要检测字幕,则设置为 False
  7. max_retries = 3 (可选参数,最大重试次数)

    • 含义: 当移动视频文件失败时,代码会尝试重新移动的最大次数。
    • 单位: 次数。
    • 作用: 避免由于临时文件占用导致的移动失败,保证代码的鲁棒性。
    • 建议值:
      • 默认值: 3 是一个比较常用的起始值。
      • 调整方向:
        • 如果你的运行环境经常出现文件被占用的问题,可以考虑增加次数,比如5
        • 如果对速度要求比较高,可以考虑减小次数,比如 2
    • 注意事项:
      • max_retries 不宜设置过高,避免一直等待占用资源。
  8. retry_delay = 5 (可选参数,重试间隔时间)

    • 含义: 当移动视频文件失败时,代码等待多长时间再次尝试移动,单位为秒。
    • 单位: 秒 (seconds)。
    • 作用: 避免频繁地重试占用文件导致系统资源紧张。
    • 建议值:
      • 默认值: 5 秒是一个比较常用的起始值。
      • 调整方向:
        • 如果你认为5秒的等待时间太长,可以缩短为3 或者更小。
        • 如果你认为5秒的等待时间太短,可以加长到10 或者更多。
    • 注意事项:
      • retry_delay 的时间不应过短,否则可能仍然因为资源未释放而移动失败。

图像处理算法详解

1. 图像缩放 (Image Resizing)

原理

图像缩放是指改变图像的尺寸,包括放大(upscaling)和缩小(downscaling)两种操作。其基本原理是通过像素插值算法,在新的尺寸下估计图像像素的值。

技术

常用的图像缩放技术包括:

  • 最近邻插值 (Nearest Neighbor Interpolation):
    • 原理: 将目标图像的像素值设置为源图像中距离最近的像素值。
    • 特点: 简单快速,但可能导致图像边缘出现锯齿状。
  • 双线性插值 (Bilinear Interpolation):
    • 原理: 使用目标图像像素周围的 2x2 邻域像素值进行双线性插值计算。
    • 特点: 图像效果比最近邻插值平滑,计算量适中。
  • 双三次插值 (Bicubic Interpolation):
    • 原理: 使用目标图像像素周围的 4x4 邻域像素值进行双三次插值计算。
    • 特点: 图像效果较好,细节保留较多,但计算量较大。
  • 基于深度学习的超分辨率 (Super-Resolution):
    • 原理: 使用深度学习模型 (例如, SRCNN, EDSR, ESRGAN) 从低分辨率图像重建高分辨率图像.
    • 特点: 可以生成高质量的图像,但是计算量大,需要大量的训练数据。

用途

  • 调整图像大小: 适应不同的显示设备或应用场景。
  • 预处理步骤: 作为其他图像处理算法 (如目标检测, OCR) 的预处理步骤.
  • 生成不同分辨率的图像: 用于创建图像金字塔或进行多尺度分析。

2. 图像裁剪 (Image Cropping)

原理

图像裁剪是指从图像中选择一个矩形区域,然后将其提取出来。其基本原理是根据指定的起始坐标和宽高,截取图像对应的像素数据。

技术

  • 矩形裁剪: 指定矩形左上角坐标(x, y) 和矩形的宽度 (w) 和高度 (h),然后提取这个矩形区域的像素。
  • 任意形状裁剪: 使用掩码 (mask) 来指定需要裁剪的区域,mask 可以是任意形状。

用途

  • 去除图像中不必要的区域: 突出感兴趣的目标对象或区域。
  • 调整图像构图: 重新构图,使图像更符合需求。
  • 数据增强: 作为图像数据增强的一种方法,可以生成不同的图像样本。

3. 图像拼接 (Image Stitching)

原理

图像拼接是指将多张具有重叠区域的图像拼接成一张完整的全景图像。其基本原理包括图像配准和图像融合两个步骤。

技术

  • 特征检测和匹配 (Feature Detection and Matching):
    • 目的: 提取图像中的特征点 (如 SIFT, SURF, ORB 等) 并进行匹配,找到图像之间的对应关系。
  • 图像配准 (Image Registration):
    • 目的: 根据匹配到的特征点,计算图像之间的变换关系,将图像对齐。
    • 技术: 使用如 RANSAC 等算法估计图像的变换矩阵。
  • 图像融合 (Image Blending):
    • 目的: 将对齐的图像拼接成一张完整的图像。
    • 技术: 使用如多频带融合或加权平均等方法处理图像重叠区域,避免明显的接缝。
  • 柱面投影:
    • **目的:**将图像映射到柱面坐标系,以便更好地拼接水平方向上视角变化很大的图像。

流程

                             +-----------------------+
                             | 开始 process_video_threaded |
                             +-----------------------+
                                        |
                                        V
                  +------------------------------------------------+
                  |  调用 process_video 处理单个视频文件         |
                  |  获取 CPU, 内存,GPU 使用率信息             |
                  |  输出视频处理信息和性能信息                      |
                  +------------------------------------------------+
                                        |
                                        V
       +------------------------------------------------------------+
       | 根据 move_file, has_subtitle, 移动文件到 output_dir_with_subtitle  |
       | 或 output_dir_without_subtitle 下的子目录,并记录日志         |
       | (如未移动,则记录未移动日志)                                  |
       +------------------------------------------------------------+
                                        |
                                        V
                  +--------------------------------------------+
                  |      结束 process_video_threaded             |
                  +--------------------------------------------+

                                          |
                                         V
                             +-----------------------+
                             | 开始 process_video   |
                             +-----------------------+
                                        |
                                        V
                    +------------------------------------------------+
                    |  使用 cv2.VideoCapture 打开视频文件              |
                    |  如果打开失败,记录日志并返回                       |
                    |  初始化 frame_count, subtitle_frame_count       |
                    |  设置跳帧参数 frame_skip                         |
                    +------------------------------------------------+
                                         |
                                         V
                            +------------------------+
                            |  while 循环读取视频帧        |
                            |    如果读取失败,退出循环 |
                            +------------------------+
                                        |
                                        V
              +----------------------------------------------+
              | 如果是抽帧,则执行字幕区域检测 detect_subtitle_area|
              |  如果检测失败 返回                               |
              +----------------------------------------------+
                                        |
                                        V
                         +---------------------------+
                         | for subtitle_area in subtitle_areas |
                         |    调用 ocr_check           |
                         +---------------------------+
                                         |
                                         V
                 +------------------------------------------------------+
                 |    根据ocr检测结果更新 subtitle_frame_count            |
                 +------------------------------------------------------+
                                        |
                                        V
            +----------------------------------------------------------+
            |  根据 subtitle_frame_count 和 min_subtitle_frames       |
            |  确定视频是否有字幕,并生成 output_file 路径            |
            |   记录视频处理信息                                      |
            +----------------------------------------------------------+
                                       |
                                       V
                   +--------------------------+
                   |  释放视频资源和GPU缓存   |
                   |     手动内存回收          |
                   +--------------------------+
                                        |
                                        V
                    +---------------------+
                    |  结束 process_video   |
                    +---------------------+
                                        |
                                         V
                           +------------------------+
                           | 开始 ocr_check      |
                           +------------------------+
                                      |
                                      V
                           +-----------------------------------+
                           | 使用 reader.readtext(roi,detail=0)     |
                           |  如果检测到文字返回 True,否则返回 False |
                           +-----------------------------------+
                                      |
                                      V
                      +--------------------------+
                      | 结束 ocr_check       |
                      +--------------------------+

用途

  • 生成全景图: 将多张图片拼接成一张宽视野的全景图像。
  • 创建高分辨率图像: 将多张低分辨率图像拼接成一张高分辨率图像。
  • 创建 3D 模型: 通过多张图片可以重建 3D 模型。

4. 图像去噪 (Image Denoising)

原理

图像去噪是指减少图像中噪声的技术。噪声是指图像中不希望出现的随机干扰信号。其基本原理是区分图像中的有用信号和噪声信号,然后对噪声信号进行抑制或去除。

技术

  • 空域滤波 (Spatial Filtering):
    • 原理: 使用滤波器对图像像素进行加权平均,以平滑图像,降低噪声。
    • 技术:
      • 均值滤波 (Mean Filtering): 使用邻域像素的平均值替换中心像素值。
      • 高斯滤波 (Gaussian Filtering): 使用高斯核对邻域像素进行加权平均。
      • 中值滤波 (Median Filtering): 使用邻域像素的中值替换中心像素值,可以去除脉冲噪声。
      • 双边滤波 (Bilateral Filtering): 结合像素的空间距离和值域相似度,在去除噪声的同时保持边缘。
  • 频域滤波 (Frequency Filtering):
    • 原理: 将图像转换到频域,对噪声频率进行抑制。
    • 技术: 使用如低通滤波器 (Low-Pass Filter) 减少高频噪声。
  • 基于深度学习的方法:
    • 原理: 使用深度学习模型 (例如,DnCNN, FFDNet, RIDNet) 从噪声图像重建清晰的图像.
    • 特点: 可以取得较好的去噪效果,但是模型训练需要大量的带噪声和无噪声的图像对。

用途

  • 提高图像质量: 去除图像中的噪声,使图像更加清晰。
  • 预处理步骤: 作为其他图像处理算法的预处理步骤,例如,用于提高目标检测或 OCR 的准确率。
  • 增强图像可读性: 降低噪声对图像的干扰,使人眼更容易识别图像内容。

5. 图像修复 (Image Inpainting)

原理

图像修复是指根据图像中已知区域的信息,恢复图像中缺失或损坏区域的技术。其基本原理是分析图像的结构和纹理信息,然后使用插值、纹理合成等方法,填充缺失区域。

技术

  • 基于扩散 (Diffusion) 的方法:
    • 原理: 根据周围的像素值逐步填充缺失区域,模拟热扩散过程。
    • 技术: 可以使用如 Navier-Stokes 方程进行建模。
  • 基于纹理合成 (Texture Synthesis) 的方法:
    • 原理: 使用周围区域的纹理来填充缺失区域。
    • 技术: 可以使用基于样本的方法或基于马尔可夫随机场的方法。
  • 基于深度学习的方法:
    • 原理: 使用深度学习模型 (例如,Context Encoder, GAN) 从已知的区域推断缺失区域的内容。
    • 特点: 可以实现较为真实的图像修复,特别是对于复杂结构和纹理的修复。

用途

  • 修复损坏的图像: 例如,修复老照片或损坏的文物图片。
  • 移除图像中的遮挡物: 例如,移除图像中的文字、水印、或不想要的对象。
  • 图像编辑: 实现高级的图像编辑功能,如移除人像上的斑点或修复背景中的瑕疵。
Next:
在ubuntu系统使用docker安装 CVAT