我需要处理一系列图像,然后使用 OCR 对其进行处理,以获得这些图像中出现的文本。
彩色图像中的文本不够清晰,OCR 无法清楚地检测图像中的文本,因此我需要获得更清晰或更锐利的文本。
在应用不同的技术将文本与图像的其余部分隔离后,我得到了具有足够对比度/清晰度的图像,可以开始下一步:消除噪声并增强图像中形成文本的像素。第一部分的结果如下所示:
我应用了不同的技术,但没有一个给出正确的结果。我应用的主要方法如下:
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 识别它。
我将不胜感激在这方面的任何帮助。 非常感谢。
答案:
看起来您的方向是正确的,但您可以进行一些调整来减少噪音,同时保持 OCR 文本的清晰度。这里有一些提示:
img = cv2.bilateralFilter(img, d=9, sigmaColor=75, sigmaSpace=75)
img = cv2.fastNlMeansDenoising(img, None, h=15, templateWindowSize=7, searchWindowSize=21)
img_threshold = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blockSize=15, C=3)
ret, th1 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
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)
增强对比度 CLAHE(对比度有限自适应直方图均衡)非常适合 改善局部对比度:
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
img_clahe = clahe.apply(img)
使用 Tesseract 进行 OCR 清理图像后,对其运行 OCR:
import pytesseract
text = pytesseract.image_to_string(img_clahe, config='--psm 6')
print(text)
希望这有帮助!