python实现根据坐标将图片进行裁剪

 更新时间:2025年11月10日 09:18:55   作者:NO1212  
这篇文章主要为大家详细介绍了如何使用python实现根据坐标将图片进行裁剪,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下

功能:

1.给一个图片,并给出图片中所有目标的坐标

2.将图中给出的坐标用框给标注出来

3.经典需求,通常称为“阅读顺序排序”或“Z字排序”。你需要先按行(从上到下)排序,在同一行内再按列(从左到右)排序。将排完序的多个框进行编号

4.对目标框进行裁图

完整代码:

import cv2
import numpy as np
import os


def test():
    path = "D:\LAELAOI\Test"
    pointtxt = os.path.join(path, "label_position.txt")
    with open(pointtxt, 'r')as f:
        content = f.readlines()
    print(content)
    boxes = []
    for i in content:
        parts = i.split(',')
        file = parts[0]
        x1, x2, y1, y2 = parts[2],parts[3],parts[4],parts[5].strip()
        print(file, x1, y1, x2, y2)
        boxes.append([x1, y1, x2, y2])
    # 进行排序
    # key=lambda box: (int(box[1]), int(box[0])) 表示:
    #   1. 先按 box 的第 1 个元素(y1)进行升序排序(从上到下)
    #   2. 如果 y1 相同,再按第 0 个元素(x1)进行升序排序(从左到右)
    #   3. int() 是为了将字符串转为数字,确保正确排序
    sorted_boxes = sorted(boxes, key=lambda box: (int(box[1]), int(box[0])))
    img = cv2.imread(r"D:\LAELAOI\Test\L_main_CAM_basler.jpg")
    # img = cv2.resize(img, (1500, 1000))
    copy_img = img.copy()
    # 遍历排序后的列表,进行编号(从1开始)
    # for index, box in enumerate(sorted_boxes, 1):
    #     x1, x2, y1, y2 = int(box[0]), int(box[1]), int(box[2]), int(box[3])
    #     cv2.rectangle(copy_img,(int(box[0]),int(box[1])), (int(box[2]),int(box[3])), (0,0, 255), 2)
    #     print(f"编号: {index}, 坐标: {box}")



    # --- 主要修改和新增的逻辑在这里 ---
    for index, box in enumerate(sorted_boxes, 1):
        # 1. 将字符串坐标转换为整数
        x1, y1, x2, y2 = map(int, box)

        # 2. 【关键修复】确保坐标顺序正确,防止计算负数半径
        # 重新计算左上角和右下角坐标,确保 x1 <= x2, y1 <= y2
        top_left_x = min(x1, x2)
        top_left_y = min(y1, y2)
        bottom_right_x = max(x1, x2)
        bottom_right_y = max(y1, y2)

        # 3. 绘制矩形框(使用修正后的坐标)
        cv2.rectangle(copy_img, (top_left_x, top_left_y), (bottom_right_x, bottom_right_y), (0, 0, 255), 2)

        # --- 新增代码开始 ---
        # 4. 计算矩形中心点
        center_x = (top_left_x + bottom_right_x) // 2
        center_y = (top_left_y + bottom_right_y) // 2

        # 7. 在圆圈中心写入编号
        font = cv2.FONT_HERSHEY_SIMPLEX
        text = str(index)
        # 计算文字大小,以便居中
        (text_width, text_height), baseline = cv2.getTextSize(text, font, 1, 2)

        # 计算文字的坐标,使其在圆圈内居中
        text_x = center_x - text_width // 2
        text_y = center_y + text_height // 2

        # 绘制文字
        # 参数:图像, 文字, 坐标, 字体, 大小, 颜色(白色), 粗细
        cv2.putText(copy_img, text, (text_x, text_y), font, 10, (0, 0, 255), 3)
        # --- 新增代码结束 ---

        print(f"编号: {index}, 原始坐标: {box}, 修正后坐标: {[top_left_x, top_left_y, bottom_right_x, bottom_right_y]}")
        cropped_img = img[y1:y2, x1:x2]
        savefile = r"D:\LAELAOI\Test\{}.jpg".format(index)
        print(savefile)
        cv2.imwrite(savefile, cropped_img)
    cv2.imwrite(r"D:\LAELAOI\Test\1111L_main_CAM_basler.jpg", copy_img)
    cv2.imshow('rr', copy_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
if __name__ == '__main__':
    test()

效果图:

到此这篇关于python实现根据坐标将图片进行裁剪的文章就介绍到这了,更多相关python图片裁剪内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python大数据用Numpy Array的原因解读

    Python大数据用Numpy Array的原因解读

    一个Numpy数组由许多值组成,所有值的类型是相同的,Numpy 是Python科学计算的一个核心模块,本文重点给大家介绍Python大数据Numpy Array的相关知识,感兴趣的朋友一起看看吧
    2022-02-02
  • 用1行Python代码识别身份证信息实例

    用1行Python代码识别身份证信息实例

    这篇文章主要介绍了用1行Python代码识别身份证信息实例的相关资料,需要的朋友可以参考下
    2023-01-01
  • python Dijkstra算法实现最短路径问题的方法

    python Dijkstra算法实现最短路径问题的方法

    这篇文章主要介绍了python Dijkstra算法实现最短路径问题的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • 浅谈pycharm的xmx和xms设置方法

    浅谈pycharm的xmx和xms设置方法

    今天小编就为大家分享一篇浅谈pycharm的xmx和xms设置方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • 关于 Python json中load和loads区别

    关于 Python json中load和loads区别

    这篇文章主要介绍了关于 Python json中load和loads区别,文章也有简单的说明它们之间的相同点,然后详细介绍不同点,需要的朋友可以参考一下文章的具体内容
    2021-11-11
  • 详细一文带你分清Python中的模块、包和库

    详细一文带你分清Python中的模块、包和库

    这篇文章主要介绍了详细一文带你分清Python中的模块、包和库,Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句,模块能定义函数,类和变量,模块也能包含可执行的代码,需要的朋友可以参考下
    2023-08-08
  • Python match语句的具体使用

    Python match语句的具体使用

    match语句接受一个表达式,并将其值与作为一个或多个case块给出的连续模式进行比较,本文主要介绍了Python match语句的具体使用,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Python如何进行时间处理

    Python如何进行时间处理

    这篇文章主要介绍了Python如何进行时间处理,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-08-08
  • Python中4种实现数值的交换方式

    Python中4种实现数值的交换方式

    这篇文章主要介绍了Python中4种实现数值的交换方式,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Python将运行结果导出为CSV格式的两种常用方法

    Python将运行结果导出为CSV格式的两种常用方法

    这篇文章主要给大家介绍了关于Python将运行结果导出为CSV格式的两种常用方法,Python生成(导出)csv文件其实很简单,我们一般可以用csv模块或者pandas库来实现,需要的朋友可以参考下
    2023-07-07

最新评论