从图像中提取的每行数字作为一张完整的图片,而不是每个数字单独成为一张图片

具体实现思路:

  1. 提取行区域:先通过轮廓或空白区域分割出每行数字。

  2. 确保每行是一个整体:在提取每行时,确保提取区域的宽度包含该行所有的数字(即避免单独分割每个数字)。

  3. 保存每一行作为一张图片:确保每行的区域保持原样,保存为单张图片。

  4. 获取轮廓并按 y 坐标排序 :先找到所有数字的轮廓,并按 y 坐标从上到下排序。这样可以确保我们从上到下处理每一行。

  5. 合并相邻行 :当检测到当前行的 y 坐标与前一行的 y 坐标非常接近时,认为它们属于同一行,可以将这两个区域合并成一张图片。

  6. 分割行并保存:将属于同一水平线的多个区域合并成一个区域后,保存为一张新的图片。

    import cv2
    import numpy as np

    读取图片

    image = cv2.imread('image.png')

    转为灰度图像

    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

    二值化图像,使得文字变为白色,背景变为黑色

    _, thresh = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY_INV)

    查找轮廓(可以忽略背景,集中在文字区域)

    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    按照y坐标排序(从上到下)

    contours = sorted(contours, key=lambda ctr: cv2.boundingRect(ctr)[1])

    设定一个阈值,用于判断是否为同一行(水平对齐)

    y_threshold = 10 # 根据实际情况调整,表示两行之间的最大间距

    初始化一个空列表,用于存储行的图片

    row_images = []
    current_row = []

    遍历所有轮廓

    for i, contour in enumerate(contours):
    x, y, w, h = cv2.boundingRect(contour)

    复制代码
     # 过滤掉噪音区域(高度过小的区域)
     if h > 20:
         # 如果当前行是空的,或者当前行的y坐标和上一行的y坐标相差较小(认为是同一行)
         if not current_row or abs(current_row[-1][1] - y) < y_threshold:
             # 将当前轮廓的区域加入当前行
             current_row.append((x, y, w, h))
         else:
             # 如果是新的一行,则合并上一行的图片并清空当前行
             if current_row:
                 # 计算当前行的左上角和右下角,合并所有小块区域
                 x_min = min([rect[0] for rect in current_row])
                 y_min = min([rect[1] for rect in current_row])
                 x_max = max([rect[0] + rect[2] for rect in current_row])
                 y_max = max([rect[1] + rect[3] for rect in current_row])
                 
                 # 裁剪出当前行的完整图像
                 row_image = image[y_min:y_max, x_min:x_max]
                 row_images.append(row_image)
    
             # 重置当前行,添加当前轮廓
             current_row = [(x, y, w, h)]

    最后处理剩余的行

    if current_row:
    # 合并最后一行
    x_min = min([rect[0] for rect in current_row])
    y_min = min([rect[1] for rect in current_row])
    x_max = max([rect[0] + rect[2] for rect in current_row])
    y_max = max([rect[1] + rect[3] for rect in current_row])

    复制代码
     row_image = image[y_min:y_max, x_min:x_max]
     row_images.append(row_image)

    保存每一行作为图片

    for i, row_image in enumerate(row_images):
    cv2.imwrite(f'row_{i+1}.png', row_image)

原图:

实现效果

相关推荐
骥龙6 分钟前
4.12、隐私保护机器学习:联邦学习在安全数据协作中的应用
人工智能·安全·网络安全
天硕国产存储技术站15 分钟前
DualPLP 双重掉电保护赋能 天硕工业级SSD筑牢关键领域安全存储方案
大数据·人工智能·安全·固态硬盘
腾讯云开发者21 分钟前
AI独孤九剑:AI没有场景,无法落地?不存在的。
人工智能
光影少年24 分钟前
node.js和nest.js做智能体开发需要会哪些东西
开发语言·javascript·人工智能·node.js
落798.27 分钟前
基于CANN与MindSpore的AI算力体验:从异构计算到应用落地的实战探索
人工智能·cann
audyxiao00139 分钟前
期刊研究热点扫描|一文了解计算机视觉顶刊TIP的研究热点
人工智能·计算机视觉·transformer·图像分割·多模态
paopao_wu40 分钟前
目标检测YOLO[04]:跑通最简单的YOLO模型训练
人工智能·yolo·目标检测
XINVRY-FPGA1 小时前
XCVP1802-2MSILSVC4072 AMD Xilinx Versal Premium Adaptive SoC FPGA
人工智能·嵌入式硬件·fpga开发·数据挖掘·云计算·硬件工程·fpga
撸码猿1 小时前
《Python AI入门》第9章 让机器读懂文字——NLP基础与情感分析实战
人工智能·python·自然语言处理
二川bro1 小时前
多模态AI开发:Python实现跨模态学习
人工智能·python·学习