You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何去除图片卷曲线条以优化Tesseract OCR文字识别?

Solutions for Removing Curved Lines Without Losing Digits in OCR

Hey there! Let's tackle this curved line issue that's messing with your Tesseract OCR results. I've dealt with similar annoying interference before, so here are some targeted approaches using OpenCV that should help you get rid of those curves without losing your digits:

1. Custom Morphological Operations with Top-Hat Transform

Curved lines are usually thin and have a rounded shape, so default rectangular kernels won't target them well. Try using a top-hat transform with an elliptical kernel to extract the curved lines, then subtract them from your thresholded image:

import cv2
import numpy as np

# Load your thresholded grayscale image
img = cv2.imread("thresholded_image.png", 0)

# Create an elliptical kernel to match the curve's shape
# Adjust (width, height) based on your curve's thickness and curvature
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (18, 6))

# Extract curved lines using top-hat transform
curved_lines = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

# Subtract lines from original image to clean it up
cleaned_img = cv2.subtract(img, curved_lines)

Play around with the kernel dimensions—smaller values for thin curves, larger for thicker ones.

2. Contour Filtering by Shape and Size

Digits have distinct contour characteristics compared to long, thin curved lines. You can filter out curve contours by checking their area and aspect ratio:

# Find all external contours in the thresholded image
contours, _ = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Create a blank mask to draw valid digit contours
mask = np.zeros_like(img)

for cnt in contours:
    area = cv2.contourArea(cnt)
    x, y, w, h = cv2.boundingRect(cnt)
    aspect_ratio = w / h

    # Adjust these thresholds based on your digit size and curve shape
    # Digits typically have a moderate area and aspect ratio (not extremely long/thin)
    if area > 60 and 0.25 < aspect_ratio < 3.5:
        cv2.drawContours(mask, [cnt], -1, 255, thickness=-1)

# Apply mask to get the cleaned image
cleaned_img = cv2.bitwise_and(img, mask)

First, print out the area and aspect ratio of a few contours to figure out the right thresholds for your specific image.

3. Adaptive Thresholding Instead of Global Thresholding

Global thresholding can flatten out subtle differences between digits and curves. Adaptive thresholding adjusts based on local pixel values, which might separate the two better:

# Apply adaptive Gaussian thresholding (adjust block size and C value as needed)
cleaned_img = cv2.adaptiveThreshold(
    img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 13, 3
)

The blockSize (must be odd) controls the local region size, and C is the subtraction constant for the mean/weighted mean. Tweak these to see what works best.

4. Tesseract Parameter Tweaks (No Need to Remove Lines Entirely)

Sometimes you don't have to eliminate lines completely—you can tell Tesseract to ignore them:

  • Use --psm 6 (or another appropriate page segmentation mode) to define the layout (e.g., assume a single uniform block of text/digits)
  • Restrict recognition to digits only with a whitelist
  • Enable stronger noise rejection

Example command:

tesseract input.png output --psm 6 -c tessedit_char_whitelist=0123456789 -c textord_noise_rejection=1

5. Hough Transform for Arc/Circle Detection (If Curves Are Circular)

If your curved lines are arcs or partial circles, use Hough Circle Transform to detect and erase them:

# Detect circles/arcs (adjust parameters based on your curve size)
circles = cv2.HoughCircles(
    img, cv2.HOUGH_GRADIENT, dp=1, minDist=20, param1=50, param2=30, minRadius=8, maxRadius=60
)

if circles is not None:
    circles = np.uint16(np.around(circles))
    for circle in circles[0, :]:
        # Draw filled black circles over detected curves to erase them
        cv2.circle(img, (circle[0], circle[1]), circle[2], 0, thickness=-1)
cleaned_img = img

This works best for curved lines with a consistent circular shape—skip this if your curves are irregular.

Pro Tip

Combine these methods for better results! For example: start with adaptive thresholding, then apply morphological operations, then filter contours, before feeding the image to Tesseract.

内容的提问来源于stack exchange,提问作者Đá Cuội

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:04:08