如何使用 PyTesseract 去除图像噪声以改善结果?

     2023-04-17     123

关键词:

【中文标题】如何使用 PyTesseract 去除图像噪声以改善结果?【英文标题】:How to get rid of image noise for improving results with PyTesseract? 【发布时间】:2020-09-03 05:54:19 【问题描述】:

我正在尝试从视频的左上角获取文本“P1”和“P2”。

P1

P2

我拍摄一帧并将它们裁剪为以下图像,然后应用此处找到的图像处理:

P1 Crop

P2 Crop

use pytesseract to recognize text from image

虽然它适用于我使用图像编辑器手动编辑的裁剪静止图像,但在使用 cv2 从视频中获取帧时它不起作用。

我不确定这是为什么,但我怀疑它与下图中的黑白背景有关,但我不知道如何在不删除文本的情况下摆脱它。

P1 post image manipulation

这是我的代码

import cv2
import pytesseract
import re
from difflib import SequenceMatcher
def determineWinner(video):
    winnerRect = [(70,95),(146,152)]
    cap = cv2.VideoCapture(video)
    if(cap.isOpened() == False):
        print("No dice")
        return
    fps = cap.get(cv2.CAP_PROP_FPS)
    frames = cap.get(cv2.CAP_PROP_FRAME_COUNT)
    print(fps)
    print(frames)
    desiredSeek = frames - int(fps * 9)
    print(desiredSeek)
    seconds = desiredSeek/fps
    print(seconds)
    minutes = seconds/60
    print(minutes)
    partial = minutes - int(minutes)
    print(partial)
    seconds = partial * 60
    print(seconds)
    print(str(int(minutes)) +":"+ str(seconds))

    cap.set(cv2.CAP_PROP_POS_FRAMES,(desiredSeek))

    ret,img = cap.read()
    winTxt = []
    p1Count = 0
    p2Count = 0

    cv2.namedWindow("",cv2.WINDOW_NORMAL)

    ret,img = cap.read()
    while ret:
        key = cv2.waitKey(1)
        if key == ord('q'):
            break
        if key == ord('e'):
            ret,img = cap.read()
            if ret:
                winROI = img[winnerRect[0][1]:winnerRect[1][1],winnerRect[0][0]:winnerRect[1][0]]
                gray = cv2.cvtColor(winROI, cv2.COLOR_BGR2GRAY)
                blur = cv2.GaussianBlur(gray, (3,3), 0)
                thresh = cv2.threshold(blur, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

                # Morph open to remove noise and invert image
                kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3,3))
                opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
                invert = 255-opening
                invert=cv2.resize(invert,None,fx=2,fy=2)
                wConfig='-l eng --oem 1 --psm 10 -c tessedit_char_whitelist=P12'
                winTxt = pytesseract.image_to_string(invert,config=wConfig)
                cv2.rectangle(img,winnerRect[0],winnerRect[1],(255,0,0),2)
                cv2.imshow("winroi",invert)
                cv2.imshow("",img)
                cv2.resizeWindow("",800,600)
                print(winTxt)
                desiredSeek+=1
                seconds = desiredSeek/fps
                minutes = seconds/60
                partial = minutes - int(minutes)
                seconds = partial * 60
                print(str(int(minutes)) +":"+ str(seconds))
            else:
                break

    cap.release()
    cv2.destroyAllWindows()

【问题讨论】:

您可以尝试应用一个滤色器(一个用于 P1 内部的蓝色)和一个用于 P2 内部的粉红色。然后,您只会看到该特定颜色。然后,您可以应用其他功能。如果您知道我的意思,请告诉我。 @CătălinaSîrbu 所以过滤我们的非红色/蓝色颜色,这就是你的意思吗? 【参考方案1】:

此代码用作测试脚本。我只提取了包含P1 的图像的参数。要在新图像上应用过滤器,只需擦除预定义的阈值,如下所示:

发件人:

low_blue, low_green, low_red, upper_blue, upper_green, upper_red = (115, 0, 0, 255, 178, 255)

收件人:

low_blue, low_green, low_red, upper_blue, upper_green, upper_red = (0, 0, 0, 255, 255, 255)

并开始修改参数,如下所述。确定好参数后,按esc退出程序,取控制台显示的参数,粘贴到thresholds元组中。


如何使用:

非常重要。要使其正常工作,您必须单击鼠标左键选择来自 cv2.imshow() 的窗口,在本例中为 Original imageBinary image

q 增加,w 降低蓝色下限

a 增加,s 降低绿色阈值下限 ...对于上下颜色 (BGR) 阈值,依此类推
import numpy as np
import cv2

low_blue, low_green, low_red, upper_blue, upper_green, upper_red = (115, 0, 0, 255, 178, 255)

# Get picture
path = "C:\\Users\\asd\\asd\\P1.png"
frame = cv2.imread(path)

while 1:

    lower_color = np.array((low_blue, low_green, low_red))
    upper_color = np.array((upper_blue, upper_green, upper_red))

    # extract binary image with active blue regions
    binary_image = cv2.inRange(frame, lower_color, upper_color)

    cv2.imshow('Original image', binary_image)

    #erode for the little white contour to dissapear
    binary_image = cv2.erode(binary_image, cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)))
    binary_image = cv2.dilate(binary_image, cv2.getStructuringElement(cv2.MORPH_RECT,(3,3)))

    cv2.imshow('Binary image  ', binary_image)

    k = cv2.waitKey(5) & 0xFF
    if k == 27:
        break
    if k == ord('q'):
        low_blue += 1
    if k == ord('w'):
        low_blue -= 1
    if k == ord('a'):
        low_green += 1
    if k == ord('s'):
        low_green -= 1
    if k == ord('z'):
        low_red += 1
    if k == ord('x'):
        low_red -= 1
    if k == ord('e'):
        upper_blue += 1
    if k == ord('r'):
        upper_blue -= 1
    if k == ord('d'):
        upper_green += 1
    if k == ord('f'):
        upper_green -= 1
    if k == ord('c'):
        upper_red += 1
    if k == ord('v'):
        upper_red -= 1

    print("low_blue=", low_blue, "low_green=", low_green, "low_red=",low_red, "upper_blue", upper_blue, "upper_green=",
          upper_green, "upper_red=",upper_red)


cv2.destroyAllWindows()

结果

发件人

收件人:

【讨论】:

给我一点时间,我正在测试,看看它是否能提高识别度 效果很好。我得到了比以前更正确的阅读方式。感谢您的帮助。 尝试使用这些值并在需要时检查更好的结果。祝你有美好的一天:)

如何使用python从图像中去除边界边缘噪声?

】如何使用python从图像中去除边界边缘噪声?【英文标题】:Howtoremoveborderedgenoisefromanimageusingpython?【发布时间】:2019-09-1817:21:34【问题描述】:我正在尝试通过用平均像素值替换黑色区域来去除图像中的黑色边框和无关的非眼... 查看详情

如何从 MATLAB 中的图像中去除高斯噪声?

】如何从MATLAB中的图像中去除高斯噪声?【英文标题】:HowtoremovegaussiannoisefromanimageinMATLAB?【发布时间】:2012-01-2623:54:48【问题描述】:我正在尝试从图像中去除高斯噪声。我自己添加了噪音:nImg=imnoise(img,\'gaussian\',0,0.01);我现... 查看详情

如何去除opencv中的二值图像噪声?

】如何去除opencv中的二值图像噪声?【英文标题】:howremovebinaryimagenoiseinopencv?【发布时间】:2012-02-0517:38:43【问题描述】:在将图像转换为二进制图像(黑白)后,如果有任何噪音怎么能我删除了不需要的噪音您可以看到下图... 查看详情

使用傅里叶变换从图像中去除周期性噪声

】使用傅里叶变换从图像中去除周期性噪声【英文标题】:RemovingperiodicnoisefromanimageusingtheFourierTransform【发布时间】:2016-03-0519:33:12【问题描述】:我正在对特定图像执行2DFFT,我得到了它的光谱分量。现在该图像已与另一张图... 查看详情

使用opencv去除噪声像素

】使用opencv去除噪声像素【英文标题】:Removalofnoisypixelsusingopencv【发布时间】:2012-07-0301:35:32【问题描述】:我正在尝试使用openCV从输入图像中检测文本。为此,我需要从图像中去除噪声分量。使用的标准是,如果某个组件的... 查看详情

使用openCV去除二值图像中的噪声

】使用openCV去除二值图像中的噪声【英文标题】:removingnoiseinabinaryimageusingopenCV【发布时间】:2012-03-0813:34:26【问题描述】:我使用openCV将视频读入VisualStudio并将其转换为灰度,然后使用函数CV_THRESH_BINARY将其转换为二进制图像。... 查看详情

如何使用 pytesseract 从图像中检测数字?

】如何使用pytesseract从图像中检测数字?【英文标题】:Howtodetectdigitsfromimagesusingpytesseract?【发布时间】:2021-08-0610:09:37【问题描述】:我正在尝试从图像中检测文本但由于某些未知原因而失败。importpytesseractasptfromPILimportImageimpor... 查看详情

OpenCV - 去除图像中的噪声

...里有一张带表格的图片。在右侧的列中,背景充满了噪点如何检测有噪声的区域?我只想对有噪声的部分应用某种过滤器,因为我需要对其进行OCR,任何类型的过滤器都会降低整体识别率而什么样的滤镜最适合去除图像中的背景... 查看详情

从图像中去除 OCR 的噪声

...】:2021-08-1604:15:52【问题描述】:我正在为我的OCRProject使用以下图片我的主要目标是在图像预处理期间从图像中删除penmarks。我继续进行了一些图像预处理,如下所示:importcv2frommatplotlibimportpyplotaspltimage_file="out.jpg"img=cv 查看详情

如何使用 Pytesseract 提取图像中的小数点

】如何使用Pytesseract提取图像中的小数点【英文标题】:HowtoextractdecimalinimagewithPytesseract【发布时间】:2019-12-2004:06:40【问题描述】:上面是图片,我已经尝试了从SO或google获得的一切,似乎没有任何效果。我无法在图像中得到确... 查看详情

hsv 阈值化后的图像噪声去除

...述】:我目前正在尝试去除这张图片上的噪点。此图像是使用cv2hsv阈值处理获得的。不幸的是,有很多随机像素和碎片需要过滤掉。我已经尝试过打开cv的fastNlMeansDenoisingColored函数,这不起作用。还有什么我可以尝试的吗?【问... 查看详情

去除图像中虚假的小噪声岛 - Python OpenCV

...图像中的背景噪音。这是未经过滤的图像。为了过滤,我使用此代码生成应保留在图像中的蒙版:element=cv2.getStructuringElement(cv2.MORPH_RECT 查看详情

如何使用 MeanShift 聚类技术去除噪声?

】如何使用MeanShift聚类技术去除噪声?【英文标题】:HowtoremovenoiseusingMeanShiftClusteringTechnique?【发布时间】:2015-09-1314:50:07【问题描述】:我正在使用meanshift聚类从我的输入数据中去除不需要的噪音。Datacanbefoundhere。这是我到目... 查看详情

如何使用鼠标在图像中绘制特定区域并使用 Pytesseract 或 EasyOCR 提取该文本?

】如何使用鼠标在图像中绘制特定区域并使用Pytesseract或EasyOCR提取该文本?【英文标题】:HowtoadrawaspecificregioninimagewithmouseandextractthattextwithPytesseractorEasyOCR?【发布时间】:2021-12-3119:28:14【问题描述】:例如我有一张像下面这样的... 查看详情

如何通过 pytesseract 搜索图像中的特定字母/单词

】如何通过pytesseract搜索图像中的特定字母/单词【英文标题】:Howcanisearchspecificletters/wordsinimagebypytesseract【发布时间】:2021-12-2114:08:27【问题描述】:我正在使用pytesseract构建一个项目,它通常会返回一个图像,其中所有字母都... 查看详情

是否可以使用 pytesseract 从图像的特定部分提取文本

】是否可以使用pytesseract从图像的特定部分提取文本【英文标题】:Isitpossibletoextracttextfromspecificportionofimageusingpytesseract【发布时间】:2020-03-1520:12:40【问题描述】:我在图像中有边界框(矩形坐标),并希望在该坐标内提取文本... 查看详情

从图像中去除高频垂直剪切噪声

】从图像中去除高频垂直剪切噪声【英文标题】:Removehighfrequencyverticalshearnoisefromimage【发布时间】:2012-03-0306:37:30【问题描述】:我有一些扫描图像,其中扫描仪似乎引入了某种我以前从未遇到过的噪音。我想找到一种自动删... 查看详情

如何使用 pytesseract 获得每一行的信心

】如何使用pytesseract获得每一行的信心【英文标题】:Howtogetconfidenceofeachlineusingpytesseract【发布时间】:2019-08-1918:41:12【问题描述】:我已成功设置Tesseract并且可以将图像转换为文本...text=pytesseract.image_to_string(Image.open(image))但是... 查看详情