# -*- codeing = utf-8 -*- # @Time : 2024/3/6 19:02 # @Author : Clown # @File : demo_ocr.py # @Software : PyCharm import cv2 import pytesseract import numpy as np from PIL import Image import pandas as pd path_in = r'C:\Users\ClownHe\Desktop\1业务支持需求单\Screenshot_2024-03-06-12-10-09-94_e39d2c7de19156b0683cd93e8735f348(1).jpg' # 加载图像 image = Image.open(path_in) image = np.array(image) # 图像预处理(灰度化) gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 文字识别 ''' psm值为3表示全自动页面分割模式(默认值)。 psm值为6表示假设文本是单个统一的块。 psm值为7表示将图像视为一个单一的文本行。 psm值为8表示将图像视为一个包含多个文本行的块。 ''' boxes = pytesseract.image_to_boxes(gray_image,lang = 'chi_sim+eng',config = '--psm 6',output_type = pytesseract.Output.STRING) ''' :识别出的字符。 :字符在图像中的左边界距离图像左侧的距离。 :字符在图像中的上边界距离图像顶部的距离。 :字符的宽度。 :字符的高度。 :模型对字符属于该类别的置信度,通常是一个介于0和1之间的值 ''' datas = pytesseract.image_to_data(gray_image,lang = 'chi_sim+eng',config = '--psm 6',output_type=pytesseract.Output.DICT) ''' level:字符的级别,表示该字符在文本中的重要性。 page_num:字符所在的页面编号。 block_num:字符所在的块编号。 par_num:字符所在的段落编号。 line_num:字符所在的行号。 word_num:字符所在的单词编号。 left:字符左边界距离图像左侧的距离。 top:字符上边界距离图像顶部的距离。 width:字符的宽度。 height:字符的高度。 conf:字符的置信度评分,表示识别结果的准确性。 text:识别出的字符本身。 ''' df_out = pd.DataFrame(datas).to_dict('records') for row in df_out: if row['conf'] in range(88,100) and row['text'] == ' ': print(row) x, y, w, h = int(row['left']), int(row['top']), int(row['width']), int(row['height']) cv2.rectangle(image, (x, y), (w+x, h+y), (0, 255, 0), 2) # 绘制文本框 for box in boxes.splitlines(): print(box,type(box)) # coordinates = box.split() # # x, y, w, h = int(coordinates[1]), int(coordinates[2]), int(coordinates[3]), int(coordinates[4]) # cv2.rectangle(image, (x, image.shape[0] - y), (w, image.shape[0] - h), (0, 255, 0), 2) # 缩放图像 scale_percent = 50 # 缩放比例(百分比) width = int(image.shape[1] * scale_percent / 100) height = int(image.shape[0] * scale_percent / 100) dim = (width, height) resized_image = cv2.resize(image, dim, interpolation=cv2.INTER_AREA) # 显示结果 cv2.imshow('Result', resized_image) cv2.waitKey(0) cv2.destroyAllWindows()