我有这个函数可以从数独表中获取数字:
def extract_sudoku(image_path):
image = cv2.imread(image_path)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
thresholded = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
contours, _ = cv2.findContours(thresholded.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
sudoku_contour = None
for contour in contours:
area = cv2.contourArea(contour)
if area > 5000:
epsilon = 0.02 * cv2.arcLength(contour, True)
approx = cv2.approxPolyDP(contour, epsilon, True)
if len(approx) == 4:
sudoku_contour = approx
break
if sudoku_contour is None:
print("Sudoku grid not found.")
return
dest_corners = np.array([[0, 0], [0, 450], [450, 450], [450, 0]], dtype=np.float32)
transform_matrix = cv2.getPerspectiveTransform(sudoku_contour.astype(np.float32), dest_corners)
warped = cv2.warpPerspective(image, transform_matrix, (450, 450))
grid = np.zeros((9, 9), dtype=np.uint8)
cell_size = warped.shape[0] // 9
for i in range(9):
for j in range(9):
cell = warped[i * cell_size:(i + 1) * cell_size, j * cell_size:(j + 1) * cell_size]
digit = pytesseract.image_to_string(cell, config=config)
if digit:
grid[i, j] = int(digit)
return grid
我已经尝试过使用这些图像(这些页面中的一堆图像,但这应该足够好地显示谜题):
这是我得到的后者的输出:
[[0 0 0 6 0 0 9 1 0]
[8 6 9 0 0 0 0 0 0]
[0 1 0 0 0 9 4 6 0]
[0 7 6 0 0 0 8 0 0]
[0 9 0 0 6 0 0 4 0]
[0 0 7 9 1 0 3 0 0]
[0 7 5 8 0 0 0 2 0]
[0 0 0 0 0 0 9 7 1]
[0 0 1 0 0 6 0 8 0]]
另一页的7s似乎是最大的问题。
有人知道如何解决这个问题吗?我的谷歌搜索并没有真正帮助我。
提前致谢!
根据我自己对此类东西的经验,我发现 PyTesseract 有点不可靠。我发现的另一个既快速又准确的模型是PaddleOCR。您可以通过首先定义读取器,然后读取 cv2 图像来轻松进行 OCR 调用:
from paddleocr import PaddleOCR
OCR = PaddleOCR(use_angle_cls=True, lang='en', show_log=False, rotation=False)
print(OCR.ocr(image))
请参阅此处的快速入门了解 Python 安装。注意:如果您的 Python 版本为 3.11 或更高版本,
paddlepaddle
依赖项很难安装。