Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从突出显示区域的图像转录文本?_Python_Opencv_Tesseract_Python Tesseract - Fatal编程技术网

Python 如何从突出显示区域的图像转录文本?

Python 如何从突出显示区域的图像转录文本?,python,opencv,tesseract,python-tesseract,Python,Opencv,Tesseract,Python Tesseract,如何使用Python中的Tesseract转录下图中突出显示区域的文本 从上到下。框大约位于(x1,y1,x2,y2) 0.2564,0.1070,0.6293,0.166 0.2377,0.6826,0.7645,0.703 0.331,0.88,0.6713,0.913 相对于宽度和高度。完整的代码如下 import cv2 import pytesseract image = cv2.imread('E5PY2.jpg') coords = [[0.2564, 0.1070, 0.6

如何使用Python中的Tesseract转录下图中突出显示区域的文本


从上到下。框大约位于(
x1
y1
x2
y2

  • 0.2564,0.1070,0.6293,0.166
  • 0.2377,0.6826,0.7645,0.703
  • 0.331,0.88,0.6713,0.913
相对于宽度和高度。完整的代码如下

import cv2
import pytesseract

image = cv2.imread('E5PY2.jpg')
coords = [[0.2564, 0.1070, 0.6293, 0.166],
          [0.2377, 0.6826, 0.7645, 0.703],
          [0.331, 0.88, 0.6713, 0.913]]
h, w, c = image.shape
for idx, (x1, y1, x2, y2) in enumerate(coords):
    x1 = int(x1 * w)
    x2 = int(x2 * w)
    y1 = int(y1 * h)
    y2 = int(y2 * h)
    print(pytesseract.image_to_string(image[y1:y2, x1:x2]))

假设高亮显示的区域具有不同的颜色,而该颜色在剩余图像中不存在——就像示例中高亮显示的突出红色一样——可以使用颜色阈值

因此,您可以为色调、饱和度和值设置适当的下限和上限。在给定的示例中,我们检测红色。因此,一般来说,我们需要两组限制,因为淡红色处于色调圆柱体的0°/180°“回转”。为了克服这一点,并且只使用一组限制,我们将获得的色调通道移动90°,并取180°的模。此外,我们有高饱和度,相当明亮的红色,所以我们可以看到饱和度水平高于80%,值水平高于50%。我们有这样一个面具:

最后要做的事情是从生成的遮罩中获得轮廓,获得相应的边界矩形,并对内容运行
pytesseract
(灰度化,使用大津阈值化以获得更好的OCR性能)。我的建议是在这里也使用这个选项

以下是包含结果的完整代码:

导入cv2
将numpy作为np导入
导入pytesseract
#读取图像
img=cv2.imread('E5PY2.jpg'))
#转换为HSV颜色空间,并分割通道
h、 s,v=cv2.split(cv2.cvt颜色(img,cv2.COLOR_BGR2HSV))
#移动色调通道,仅使用一个范围检测红色区域
h_2=(h.aType(int)+90)%180.aType(h.dtype)
#使用颜色阈值遮罩高亮显示的框
下限=np.数组([70,整数(0.80*255),整数(0.50*255)])
上限=np.数组([110,int(1.00*255),int(1.00*255)])
突出显示=cv2.inRange(cv2.merge([h_2,s,v]),下,上)
#在OpenCV版本中查找等高线w.r.t;检索边界矩形
cnts=cv2.查找到的对象(高亮显示,cv2.RETR\u外部,cv2.链约为\u无)
如果len(cnts)==2个其他cnts[1],则cnts=cnts[0]
rects=[cv2.boundingRect(cnt)表示cnt中的cnt]
#迭代边界框和OCR
对于矩形中的x、y、w、h:
#灰度和阈值使用大津
功=cv2.CVT颜色(img[y:y+h,x:x+w],cv2.COLOR\u bgr2灰色)
功=cv2.阈值(功,0,255,cv2.阈值[1]
#Pyteseract带-psm 6
text=pytesseract.image_to_字符串(工作,配置='--psm 6')\
.replace('\n','').replace('\f','')
打印('X:{},Y:{},文本:{}'。格式(X,Y,文本))
#X:468,Y:1574,文本:开始冥想
#X:332,Y:1230,文本:干得好。通过注册,您已经取得了第一个
#X:358,Y:182,文本:欢迎
警告:我使用了来自的Tesseract的特殊版本

----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.19041-SP0
Python:3.9.1
PyCharm:2021.1.1
NumPy:1.20.3
OpenCV:4.5.2
比重瓶:5.0.0-alpha.20201127
----------------------------------------

为什么不在突出显示处裁剪图像?问题应该是如何从图像中裁剪这些区域。但这可以通过多种方式实现,并且您需要了解具体的用例。例如,除了这张图片外,还有什么其他的图片?或者你是如何选择这些单词的?为什么不选择其他词呢?这只是一个例子。在这种情况下,所有图像都是相似的,并且具有相同的高亮显示区域。我只想知道,如何从这些区域转录文本?你的意思是像
pytesseract.image\u to_string(image[100:350,50:100])
?谢谢,但你是如何找到坐标的?谢谢,但我没有突出显示的区域,我只知道边界。建议的方法找到这些边界,并获取其中的区域,以便在那里进行OCR。我必须问:您是否阅读并理解了呈现的代码?如果结果(最后三行,评论)不是你期望的,那么你应该在问题中明确你的实际目标是什么。嗨。你能再多了解一下这个代码吗?---h_2=((h.astype(int)+90)%180)astype(h.dtype)---------------------------work=cv2.cvtColor(img[y:y+h,x:x+w],cv2.COLOR\u bgr2 gray)work=cv2.threshold(work,0255,cv2.THRESH_-OTSU)[1]@Oleg 1)请看一看链接在HSV颜色空间上的维基百科文章。在色调值从0°到20°以及从340°到360°的范围内可以发现红色。因此,需要两组边界来检测红色,因此需要两个
cv2.inRange
调用。为了简化这一点,我将所有色调值移动90°,这样可以在70°到110°之间找到红色。2) 这就是切片(裁剪到ROI)和颜色转换到灰度,需要进行以下阈值处理。3) 这是阈值使用。