基于JSON的图片缺陷处理流程
├── 1. 输入检查
│   ├── 验证图片文件是否存在
│   └── 验证JSON文件是否存在
│
├── 2. 数据加载
│   ├── 打开并加载图片
│   └── 读取并解析JSON文件
│
├── 3. 缺陷信息提取
│   ├── 检查JSON中是否存在shapes字段
│   └── 遍历每个缺陷形状
│       ├── 验证形状类型是否为矩形
│       ├── 提取缺陷坐标点
│       └── 计算边界框(左上角和右下角)
│
├── 4. 缺陷区域处理
│   ├── 从原图裁剪缺陷区域
│   ├── 保存缺陷区域为BMP文件
│   └── 在原图上标记缺陷位置
│
└── 5. 结果保存├── 保存标记后的原图└── 输出处理结果信息

安装好包,修改好文件路径后,可直接使用的代码展示:

(注意,原图与Json文件要在同一目录下)

import json
import os
from PIL import Image, ImageDraw# 在pycharm中通过josn文件定位图片缺陷点,并复制一份缺陷特征打印成bmp文件保存在该路径def process_defects(image_path, json_path):"""基于JSON文件中的坐标信息,处理图片中的缺陷:param image_path: 图片文件路径:param json_path: JSON文件路径,包含缺陷坐标"""try:# 加载图片with Image.open(image_path) as img:# 读取JSON文件with open(json_path, 'r') as f:defect_data = json.load(f)# 从shapes字段获取缺陷信息(适配实际JSON结构)if 'shapes' not in defect_data or not defect_data['shapes']:print("JSON文件中未发现缺陷信息")return# 获取图片目录和基本名称img_dir = os.path.dirname(image_path)img_base_name = os.path.splitext(os.path.basename(image_path))[0]# 为每个缺陷创建子图像for i, shape in enumerate(defect_data['shapes']):# 检查是否为矩形if shape.get('shape_type') != 'rectangle':print(f"缺陷 {i + 1} 不是矩形,跳过")continue# 从points提取坐标(四个点转为两个点)points = shape.get('points')if not points or len(points) != 4:print(f"缺陷 {i + 1} 的坐标格式不正确")continue# 提取左上角和右下角坐标x_coords = [p[0] for p in points]y_coords = [p[1] for p in points]left = min(x_coords)top = min(y_coords)right = max(x_coords)bottom = max(y_coords)# 转换为整数left, top, right, bottom = map(int, [left, top, right, bottom])# 提取缺陷区域defect_region = img.crop((left, top, right, bottom))# 保存缺陷区域为BMP文件defect_filename = f"{img_base_name}_defect_{i + 1}.bmp"defect_filepath = os.path.join(img_dir, defect_filename)defect_region.save(defect_filepath, 'BMP')print(f"缺陷 {i + 1} 已保存至: {defect_filepath}")# 在原图上标记缺陷draw = ImageDraw.Draw(img)draw.rectangle([left, top, right, bottom], outline="red", width=2)# 保存标记后的原图(可选)marked_img_path = os.path.join(img_dir, f"{img_base_name}_marked.jpg")img.save(marked_img_path)print(f"标记后的图片已保存至: {marked_img_path}")except FileNotFoundError as e:print(f"错误:文件未找到 - {e}")except json.JSONDecodeError:print(f"错误:无法解析JSON文件 - {json_path}")except Exception as e:print(f"发生未知错误: {e}")if __name__ == "__main__":# 使用实际文件路径image_file = r"pptt\0.bmp"json_file = r"pptt\0.json"# 检查文件是否存在if os.path.exists(image_file) and os.path.exists(json_file):process_defects(image_file, json_file)else:print("请提供有效的图片和JSON文件路径")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90805.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90805.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/90805.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis基础学习(五大值数据类型的常用操作命令)

目录 一、Redis基本知识与Redis键(key)常用操作命令。 二、Redis的五大值的数据类型。(value) 三、Redis关于键(key)的值常用操作指令表格统计。 (1)字符串(String&#…

Ubuntu——办公软件 LibreOffice 安装与使用指南

十四、LibreOffice 安装与使用1、核心组件组件​​​​图标​​​​对应MS Office​​​​核心功能定位​​​​Writer​​📝Word专业文档处理与排版​​Calc​​📊Excel数据计算与分析​​Impress​​🎬PowerPoint演示文稿制作​​Draw​​&…

Securecrt丢失tab以及终端重新配色

今天在使用 Securecrt 的时候,发现 Securecrt 的 tab 标签消失不见了,仔细回想起来,应该是上一次误按了 alt enter 最大化,然后导致配置丢失的问题 还有表现就是菜单中的 Session Tabs 无论勾选还是不勾选都没有任何变化&#xf…

frp搭建内网穿透教程

frp搭建内网穿透教程 步骤1:准备工作 公网服务器:需要一台具有公网IP的服务器作为中转服务器,安装frp服务器端(frps)。内网设备:需要暴露服务的内网设备,安装frp客户端(frpc&#xf…

【JavaEE进阶】图书管理系统(未完待续)

目录 用户登录 添加图书 图书列表 修改图书 删除图书 批量删除 拦截器 🍃前言 什么是拦截器? 拦截器的基本使用 自定义拦截器 注册配置拦截器 拦截路径 拦截器执行流程 项目实现统一拦截 定义拦截器 注册配置拦截器 前⾯图书管理系统, 咱们只完成了⽤⼾登录和图书列…

基于同花顺API的熊市与牛市识别模型开发及因子分析

基于同花顺API的熊市与牛市识别模型开发及因子分析 1. 引言 1.1 研究背景与意义 金融市场中的牛市与熊市识别一直是投资者和研究人员关注的重点问题。牛市(Bull Market)通常指价格持续上涨的市场环境,投资者信心充足,交易活跃;而熊市(Bear Market)则指价格持续下跌的市场…

AMD 锐龙 AI MAX+ 395 处理器与端侧 AI 部署的行业实践

2025 年 7 月 10 日,AMD 在深圳召开 Mini AI 工作站行业解决方案峰会,正式发布基于锐龙 AI MAX 395 处理器的端侧 AI 部署方案,与 200 余家生态伙伴共同探讨 AI 技术在千行百业的落地路径。这一硬件平台通过异构计算架构与开放生态设计&#…

期权盘位是什么意思?

本文主要介绍期权盘位是什么意思?“期权盘位”并非金融交易中的标准术语,可能是口语化表达或对某些概念的简化描述。期权盘位是什么意思?1. 期权盘口的“价位”(买卖报价位置)在期权交易中,“盘口”通常指实…

【Trea】Trea国内版|国际版|海外版下载|Mac版|Windows版|Linux下载配置教程

【Trea】Trea国内版|国际版|海外版下载|Mac版|Windows版下载配置教程 本文适用读者: 想要第一次安装 Trea需要在 Windows 或 macOS 上完成环境配置想深入了解 Doubao、DeepSeek、ChatGPT、Claude 等模型在 Trea 中的接…

MyBatis实现分页查询-苍穹外卖笔记

首先分页查询的原理是SQL的limit关键字。LIMIT 子句用于限制 SQL 查询返回的记录数。它接受一个或两个整数参数,第一个参数表示偏移量,第二个参数表示返回的最大记录数。我们完全可以使用前端传给我们的page,pageSize,自己去计算limit的参数,…

系统性能评估方法深度解析:从经典到现代

评估本质:系统性能评估是通过量化分析衡量计算机系统在特定工作负载下的表现能力,核心目标是建立可比较的性能基准,为系统设计、选型和优化提供科学依据。一、评估方法分类体系 #mermaid-svg-0ceD4AA2KDwzwtb6 {font-family:"trebuchet …

WebSocket实现多人实时在线聊天

最近公司在做一个婚恋app&#xff0c;需要增加一个功能&#xff0c;实现多人实时在线聊天。基于WebSocket在Springboot中的使用&#xff0c;前端使用vue开发。 一&#xff1a;后端 1. 引入 websocket 的 maven 依赖 <dependency><groupId>org.springframework.bo…

学习笔记随记-FPGA/硬件加速

一、FPGA&#xff1a;Field Programmable Gate Array 现场可编程门阵列 可编程输入/输出单元、基本可编程逻辑单元、嵌入式块RAM、丰富的布线资源、底层嵌入功能单元和内嵌专用硬核。 可编程输入/输出单元&#xff08;I/O&#xff09;单元 输入/输出&#xff08;Input/Ouput&…

docker宿主机修改ip后起不来问题解决

确保容器已经连接到了正确的网络。如果没有&#xff0c;你可以使用以下命令将容器连接到网络&#xff1a; 1、停止docker网络 ifconfig docker0 down1. 停止 Docker 服务 sudo systemctl stop docker2. 删除 docker0 接口 sudo ip link delete docker03、删除旧的网桥 docker n…

G1 垃圾回收算法详解

目录 简介 G1 GC 的设计目标 内存结构 回收过程 初始标记&#xff08;Initial Mark&#xff09;并发标记&#xff08;Concurrent Mark&#xff09;最终标记&#xff08;Final Mark / Remark&#xff09;筛选回收&#xff08;Cleanup / Evacuation&#xff09; 混合回收&…

JavaEE多线程——锁策略 CAS synchronized优化

目录前言1.锁策略1.1 乐观锁和悲观锁1.2 重量级锁和轻量级锁1.3 挂起等待锁和自旋锁1.4 公平锁和非公平锁1.5 可重入锁和不可重入锁1.6 读写锁2.CAS2.1 CAS的应用2.2 CAS的ABA问题3.synchronized优化3.1锁升级3.2锁消除3.3锁粗化总结前言 本篇文章主要介绍多线程中锁策略、CAS…

Windows符号链接解决vscode和pycharm占用C盘空间太大的问题

Windows符号链接解决vscode和pycharm占用C盘空间太大的问题 参考文章&#xff1a;Windows符号链接 1、找到vscode和pycharm在C盘的缓存文件夹。 C:\Users\用户名\AppData\Roaming\Code C:\Users\用户名\.vscode\extensionsC:\Users\用户名\AppData\Local\JetBrains C:\Users…

赋能家庭、行业与工业场景,智微智能新一代Twin Lake 全栈智能终端发布

在数字化浪潮席卷全球的今天&#xff0c;智能终端已成为连接物理世界与数字世界的核心枢纽。智微智能基于Intel Twin Lake平台&#xff0c;推出覆盖家庭/行业应用及工业物联网的全场景产品矩阵&#xff0c;为不同场景下的用户提供高效、可靠的产品和解决方案。Intel Twin Lake架…

复习笔记 31

前言 好好复习。今天距离考研初试还剩一百六十一天。我的时间其实没剩多少了呀。我得好好加油。 归并排序 #include<algorithm> #include<iostream>using namespace std;const int N 100010; int n; int a[N], tmp[N];void merge ( int a[], int l, int r ) {if (…

el-tree 懒加载 loadNode

el-tree 是 Element UI 提供的树形组件&#xff0c;其懒加载功能通过 loadNode 方法实现&#xff0c;可以在用户展开节点时动态加载子节点数据&#xff0c;避免一次性加载大量数据。下面介绍 loadNode 的具体用法和示例。基本用法loadNode 是 el-tree 的一个重要属性&#xff0…