去除图像中的噪声,以便使用 OCR 处理文本

问题描述 投票:0回答:1

我需要处理一系列图像,然后使用 OCR 对其进行处理,以获得这些图像中出现的文本。

彩色图像中的文本不够清晰,OCR 无法清楚地检测图像中的文本,因此我需要获得更清晰或更锐利的文本。

在应用不同的技术将文本与图像的其余部分隔离后,我得到了具有足够对比度/清晰度的图像,可以开始下一步:消除噪声并增强图像中形成文本的像素。第一部分的结果如下所示:

Colored image #1 Cleared image #1

Colored image #2 Cleared image #2

Colored image #3 Cleared image #3

我应用了不同的技术,但没有一个给出正确的结果。我应用的主要方法如下:

def posterize(img = None, image_path = None, level = 3):

    if image_path:
        image = cv2.imread(image_path)
    else:
        image = img

    result = image.copy()

    indices = np.arange(0,256)
    divider = np.linspace(0, 255, level + 1)[1]
    quantiz = np.intp(np.linspace(0, 255, level))
    color_levels = np.clip(np.intp(indices/divider), 0, level - 1)
    palette = quantiz[color_levels]

    im2 = palette[image]

    result = cv2.convertScaleAbs(im2)

    return result


img = cv2.imread(image_path,cv2.IMREAD_GRAYSCALE)
blur = cv2.medianBlur(img,3)
post = posterize(blur, image_path = None, level = 5)
image = cv2.adaptiveThreshold(post,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,2)

kernel = np.ones((2, 2), np.uint8)
final = cv2.dilate(image, kernel, iterations=1)

我尝试过其他技术,但结果相似或更差,例如:

轮廓搜索和绘制:

edged = cv2.Canny(blur, 50, 100) 
contours, hierarchy = cv2.findContours(edged, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0,255,0), 1)

不同的阈值技术与腐蚀和膨胀相结合:

ret,th = cv2.threshold(blur,90,255,cv2.THRESH_BINARY).
kernel = np.ones((2, 2), np.uint8)
image = cv2.erode(image, kernel, iterations=1)

kernel = np.ones((1, 1), np.uint8)
image = cv2.dilate(image, kernel, iterations=1)

降噪:

image = cv2.fastNlMeansDenoising(img,None,20,7,21)

但是我使用过的任何方法总是给我带来同样的问题:降噪伴随着字母中像素的损失,使得最终的文本难以阅读。

我需要找到一种技术或方法来充分清理图像,同时保持文本足够清晰以便 OCR 识别它。

我将不胜感激在这方面的任何帮助。 非常感谢。

python opencv ocr noise-reduction
1个回答
0
投票

答案:

看起来您的方向是正确的,但您可以进行一些调整来减少噪音,同时保持 OCR 文本的清晰度。这里有一些提示:

  1. 去噪而不模糊文本
  • 双边滤波器:有利于降噪而不丢失文本细节:
    img = cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)
  • Non-Local Means Denoising:调整h参数以平衡降噪和边缘保留:
    img = cv2.fastNlMeansDenoising(img, None, h=15, templateWindowSize=7, searchWindowSize=21)
  1. 文本增强阈值
  • 自适应阈值:使用 blockSizeC 进行实验以微调文本可见性:
    img_threshold = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blockSize=15, C=3)
  • Otsu 的阈值:如果自适应不起作用,请尝试Otsu 的方法进行自动二值化:
    ret, th1 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
  1. 形态学运算
  • 腐蚀和膨胀:使用小内核进行腐蚀以去除噪声,然后膨胀以增强文本:
    kernel = np.ones((2, 2), np.uint8)
    img_eroded = cv2.erode(img_threshold, kernel, iterations=1)
    img_dilated = cv2.dilate(img_eroded, kernel, iterations=2)
  1. 增强对比度 CLAHE(对比度有限自适应直方图均衡)非常适合 改善局部对比度:

    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    img_clahe = clahe.apply(img)

  2. 使用 Tesseract 进行 OCR 清理图像后,对其运行 OCR:

    import pytesseract
    text = pytesseract.image_to_string(img_clahe, config='--psm 6')
    print(text)

最后提示:

  • 使用 双边过滤fastNlMeansDenoising 进行降噪,而不会使文本模糊。
  • 使用自适应阈值化大津方法进行二值化实验。
  • 侵蚀膨胀有助于清理文本。
  • 使用 CLAHE 增强对比度。
  • 最后,将清理后的图像传递给Tesseract OCR以获得更好的效果。

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.