如何去除验证码网格线并提取文本?(OpenCV新手求助)
基于OpenCV的带网格/凸起图像文本提取方案
一、预处理流程:去网格+校正畸变+图像增强
1. 去除网格线
针对规则的横竖网格,用形态学开运算分别消除横线和竖线:
import cv2 import numpy as np # 读取灰度图像 img = cv2.imread('目标图像.png', 0) # 消除水平网格线 horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (40, 1)) remove_horizontal = cv2.morphologyEx(img, cv2.MORPH_OPEN, horizontal_kernel, iterations=2) horizontal_mask = cv2.threshold(remove_horizontal, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] img_no_horizontal = cv2.bitwise_and(img, img, mask=horizontal_mask) # 消除垂直网格线 vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 40)) remove_vertical = cv2.morphologyEx(img_no_horizontal, cv2.MORPH_OPEN, vertical_kernel, iterations=2) vertical_mask = cv2.threshold(remove_vertical, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] img_no_grid = cv2.bitwise_and(img_no_horizontal, img_no_horizontal, mask=vertical_mask)
2. 校正中间圆形凸起畸变
如果文本区域近似矩形,用透视变换快速校正;若为球面畸变,可后续尝试相机标定后的畸变校正:
# 手动标记文本区域的四个角点(需根据实际图像调整坐标) src_pts = np.float32([[60, 60], [440, 60], [60, 440], [440, 440]]) dst_pts = np.float32([[0, 0], [400, 0], [0, 400], [400, 400]]) # 生成透视变换矩阵并应用 transform_matrix = cv2.getPerspectiveTransform(src_pts, dst_pts) img_corrected = cv2.warpPerspective(img_no_grid, transform_matrix, (400, 400))
3. 降噪与二值化增强
通过高斯模糊降噪,再用自适应阈值生成清晰的二值图像:
# 高斯模糊去除噪声 blurred_img = cv2.GaussianBlur(img_corrected, (3, 3), 0) # 自适应阈值二值化,突出文本 binary_img = cv2.adaptiveThreshold(blurred_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
二、文本提取(OCR)
使用Tesseract OCR提取文本(需提前安装pytesseract库和Tesseract引擎):
import pytesseract # 若Tesseract未加入系统环境变量,需指定路径 # pytesseract.pytesseract.tesseract_cmd = r'你的Tesseract安装路径\tesseract.exe' # 提取图像文本 extracted_text = pytesseract.image_to_string(binary_img, lang='eng') print(extracted_text)
内容的提问来源于stack exchange,提问作者Pankaj Singhal
相关产品推荐
相关产品推荐

