本节观点:一个好的提问就已经解决了问题的90%。

对于问题的描述正确与否决定了解决问题的方法和路径,所以我们在AI时代必须要学会正确的描述问题和表达问题,否则即使有AI辅助也是很难精准的解决问题。

我的问题:

如何利用代码从图片集中筛选出出血的图片,定义出血:提取图片中的边缘,我希望通过设置一个值来界定,比如所有边缘线与图像边缘接触的总条数超过10条才算出血图片,另外图像中的边缘线段至少长20像素才计入有效边缘线段,同时要考虑图片路径含有中文的问题。

如下图所示,其中1,2是出血的图,3,4是没有出血的图。通过上方的描述提交给AI,AI就能帮我们实现批量筛选所有出血的图片。
在这里插入图片描述

特别说明:

国产AI水平确实远低于国外的,同样的问题,GPT一次就搞定了代码,而豆包,qwen,deepseek等从多国产AI提问了N轮最后连最基本的读图时中文路径问题都无法搞定,可笑至极。加油国产AI。

import cv2
import numpy as np
import os
import shutildef read_image_chinese_path(image_path):# 支持中文路径读取image_data = np.fromfile(image_path, dtype=np.uint8)img = cv2.imdecode(image_data, cv2.IMREAD_COLOR)return imgdef is_bleeding_image(image_path, edge_touch_threshold=10, min_edge_length=20):img = read_image_chinese_path(image_path)if img is None:print(f"无法读取图片: {image_path}")return Falseheight, width = img.shape[:2]# 灰度 + Canny 边缘检测gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)edges = cv2.Canny(gray, 100, 200)# 查找轮廓contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)edge_touch_count = 0for cnt in contours:# 计算轮廓长度length = cv2.arcLength(cnt, closed=False)if length < min_edge_length:continue  # 过滤掉短轮廓# 检查是否有点在图像边界for point in cnt:x, y = point[0]if x <= 0 or y <= 0 or x >= width-1 or y >= height-1:edge_touch_count += 1break  # 这条轮廓计数一次就够return edge_touch_count >= edge_touch_thresholddef find_and_move_bleeding_images(folder_path, output_folder, edge_touch_threshold=10, min_edge_length=20):if not os.path.exists(output_folder):os.makedirs(output_folder)for root, _, files in os.walk(folder_path):for file in files:if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):file_path = os.path.join(root, file)if is_bleeding_image(file_path, edge_touch_threshold, min_edge_length):print(f"检测到出血: {file_path}")# 生成输出路径output_path = os.path.join(output_folder, file)# 如果重名文件,改名避免覆盖base, ext = os.path.splitext(output_path)counter = 1while os.path.exists(output_path):output_path = f"{base}_{counter}{ext}"counter += 1# 移动文件shutil.move(file_path, output_path)if __name__ == "__main__":input_folder = r"images"         # 输入图片文件夹路径output_folder = r"output_images"    # 检测到出血后保存到这里find_and_move_bleeding_images(input_folder, output_folder,edge_touch_threshold=10,min_edge_length=20)print("✅ 所有出血图片已移动至 output_images 文件夹")

最后描述问题过程:
第1次:
我有几张图片,其中有一张图片内容是非常完整的,主体在图的中间(这里要考虑图片的背景,有的图片背景是纯白色,有的图片是纯黑色,有的图片的是其它纯色的背景),而其余的图片都是主体出血。如何利用代码检测或筛选出主体没𠕇出血的图片
出来的代码只能做到60%选对。

第2次:
重新整理一下思路:1,分别取出图像外边1像素宽的边缘,2.分别计算每边的像素色值是否一样,如果计算出有明显不同的像素色值部分的像素总计超过5%单边所有像素色值比例的说明是出血图像。
出来的代码只能做到65%选对。

第3次:
如何利用代码从图片集中筛选出出血的图片,定义出血:提取图片中的边缘,我希望通过设置一个值来界定,比如所有边缘线与图像边缘接触的总条数超过10条才算出血图片,另外图像中的边缘线段至少长20像素才计入有效边缘线段,同时要考虑图片路径含有中文的问题。
出来的代码只能做到95%选对。

最终代码

import cv2
import numpy as np
import os
import shutildef read_image_chinese_path(image_path):"""支持中文路径读取"""image_data = np.fromfile(image_path, dtype=np.uint8)img = cv2.imdecode(image_data, cv2.IMREAD_COLOR)return imgdef has_large_colored_block_with_edges(img, block_size=10, edge_proximity=5):"""检查是否存在大于 block_size 的色块且色块两侧有边缘线,并且色块接近图像边缘"""height, width = img.shape[:2]# 边缘检测gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)edges = cv2.Canny(gray, 100, 200)# 查找轮廓contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for cnt in contours:x, y, w, h = cv2.boundingRect(cnt)# 判断色块尺寸是否足够大if w >= block_size and h >= block_size:# 检查色块是否靠近图像边缘if (x <= edge_proximity or y <= edge_proximity orx + w >= width - edge_proximity ory + h >= height - edge_proximity):# 检查 ROI 内边缘线roi_edges = edges[y:y+h, x:x+w]top_edge = np.sum(roi_edges[0, :] > 0)bottom_edge = np.sum(roi_edges[-1, :] > 0)left_edge = np.sum(roi_edges[:, 0] > 0)right_edge = np.sum(roi_edges[:, -1] > 0)edge_threshold = 3  # 至少3个像素视作边缘线if (left_edge >= edge_threshold and right_edge >= edge_threshold):return True  # 找到了符合要求的色块return Falsedef is_bleeding_image(image_path, edge_touch_threshold=10, min_edge_length=20, block_size=10):img = read_image_chinese_path(image_path)if img is None:print(f"无法读取图片: {image_path}")return Falseheight, width = img.shape[:2]# 灰度 + 边缘检测gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)edges = cv2.Canny(gray, 100, 200)# 查找所有外轮廓contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)edge_touch_count = 0for cnt in contours:# 计算轮廓长度length = cv2.arcLength(cnt, closed=False)if length < min_edge_length:continue# 检查是否触碰图像边界for point in cnt:x, y = point[0]if x <= 0 or y <= 0 or x >= width-1 or y >= height-1:edge_touch_count += 1break# 条件1:足够多的触边线条if edge_touch_count < edge_touch_threshold:return False# 条件2:是否有色块两侧有边缘if not has_large_colored_block_with_edges(img, block_size):return Falsereturn True  # 两个条件都满足def find_and_move_bleeding_images(folder_path, output_folder, edge_touch_threshold=10, min_edge_length=20, block_size=10):if not os.path.exists(output_folder):os.makedirs(output_folder)for root, _, files in os.walk(folder_path):for file in files:if file.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):file_path = os.path.join(root, file)if is_bleeding_image(file_path, edge_touch_threshold, min_edge_length, block_size):print(f"检测到出血: {file_path}")# 生成输出路径output_path = os.path.join(output_folder, file)base, ext = os.path.splitext(output_path)counter = 1while os.path.exists(output_path):output_path = f"{base}_{counter}{ext}"counter += 1# 移动文件shutil.move(file_path, output_path)if __name__ == "__main__":input_folder = r"images"         # 输入文件夹路径output_folder = r"output_images"    # 出血图片保存路径find_and_move_bleeding_images(input_folder, output_folder,edge_touch_threshold=1,    # 触边线条数阈值min_edge_length=2,         # 有效边缘线长度block_size=2               # 色块尺寸阈值)print("✅ 所有出血图片已移动至 output_images 文件夹")

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【Docker基础】Dockerfile指令速览:文件与目录操作指令详解

目录 引言 1 ADD&#xff1a;高级文件复制与解压 1.1 指令简介 1.2 语法 1.3 功能详解 1.4 使用场景 1.5 执行流程 1.6 示例 1.7 注意事项 2 WORKDIR&#xff1a;设置工作目录 2.1 指令简介 2.2 语法 2.3 使用场景 2.4 创建流程 2.5 示例 2.6 注意事项 3 VOLU…

Python 程序设计讲义(2):Python 概述

Python 程序设计讲义&#xff08;2&#xff09;&#xff1a;Python 概述 一、Python 语言的发展史 Python 语言诞生于 1990 年。 2002 年 10 月&#xff0c;Python2.0 正式发布。 2008 年 12 月&#xff0c;Python3.0 正式发布。 Python3.0 在语法层面和解释器内部做了很多重大…

多租户SaaS系统中设计安全便捷的跨租户流程共享

四维协同架构​​,结合动态授权、加密传输、行为审计和智能策略 一、​​权限控制体系​​ 1. ​​动态权限模型​ ​ 2. ​​授权策略实现​​ ​​RBAC+ABAC混合模型​​ 在流程表增加shared_tenants字段存储授权信息,结合属性动态校验: CREATE TABLE workflow_process…

Spring Ioc Bean 到底是什么

Bean 到底是什么&#xff1f; 简单来说&#xff0c;Spring Bean 就是一个由 Spring IoC 容器负责创建、管理和装配的 Java 对象。 它不是一种新的技术&#xff0c;它本质上还是一个普普通通的 Java 对象&#xff08;POJO - Plain Old Java Object&#xff09;&#xff0c;但它的…

【PCIe 总线及设备入门学习专栏 5.1.1 -- PCIe PERST# 信号的作用】

文章目录 PCIe PERSTN#PERST# 信号作用概述简要定义PERST# 的关键功能PERST# 的时序图示意Synopsys PCIe EP IP 中 PERST# 的作用关键信号接口典型复位流程示例代码(Verilog for Synopsys PCIe)PERST# 使用场景举例(Synopsys PCIe EP)1. 系统上电初始化2. 热复位特定设备3.…

使用python的pillow模块将图片转化为灰度图,获取值和修改值

使用python的pillow模块可以将图片转化为灰度图&#xff0c; 可以获取灰度图的特定点值&#xff0c;区域值&#xff0c; 修改值并保存到图片 图片转换为灰度图 from PIL import Image# 打开图片 image Image.open("d://python//2//1.jpg")gray_image image.convert…

记忆力训练day41

通常是一个地点记2组词 数字和人体记忆宫殿更注重 即时性&#xff1b;地点记忆宫殿是长久性

自动微分模块

一.前言本章节我们是要学习梯队计算&#xff0c;⾃动微分&#xff08;Autograd&#xff09;模块对张量做了进⼀步的封装&#xff0c;具有⾃动求导功能。⾃动微分模块是构成神经⽹络 训练的必要模块&#xff0c;在神经⽹络的反向传播过程中&#xff0c;Autograd 模块基于正向计算…

深度学习·目标检测和语义分割基础

边缘框 不是标准的x&#xff0c;y坐标轴。边缘框三种表示&#xff1a;左上右下下坐标&#xff0c;左上坐标长宽&#xff0c;中心坐标长宽 COCO 目标检测数据集的格式&#xff1a;注意一个图片有多个物体&#xff0c;使用csv或者文件夹结构的格式不可取。 锚框算法 生成很多…

ffmpeg音视频处理大纲

FFmpeg 是一个功能强大的开源音视频处理工具集&#xff0c;其核心代码以 C 语言实现。下面从源码角度分析 FFmpeg 如何实现转码、压缩、提取、截取、拼接、合并和录屏等功能&#xff1a; 一、FFmpeg 核心架构与数据结构 FFmpeg 的源码结构围绕以下核心组件展开&#xff1a; lib…

网络安全小练习

一、docker搭建 1.安装 2.改变镜像源&#xff08;推荐国内镜像源&#xff1a;阿里云镜像源&#xff09; 登录阿里云容器镜像源服务&#xff08; 阿里云登录 - 欢迎登录阿里云&#xff0c;安全稳定的云计算服务平台 &#xff09; 复制系统分配的专属地址 配置 sudo mkdir …

数据结构——顺序表的相关操作

一、顺序表基础认知​1.顺序表的定义与特点​顺序表是数据结构中一种线性存储结构&#xff0c;它将数据元素按照逻辑顺序依次存储在一片连续的物理内存空间中。简单来说&#xff0c;就是用一段地址连续的存储单元依次存放线性表的元素&#xff0c;且元素之间的逻辑关系通过物理…

2025最新国产用例管理工具评测:Gitee Test、禅道、蓝凌测试、TestOps 哪家更懂研发协同?

在快节奏的 DevOps 时代&#xff0c;测试用例管理已不再是 QA 的独角戏&#xff0c;而是穿透需求—开发—测试—交付全流程的核心枢纽。想象一下&#xff0c;如果用例结构混乱&#xff0c;覆盖不全&#xff0c;甚至丢失版本变更历史&#xff0c;不仅协作乱&#xff0c;还影响交…

在线评测系统开发交流

https://space.bilibili.com/700332132?spm_id_from333.788.0.0 实验内容爬虫Web系统设计数据分析实验指导爬虫Web系统设计自然语言处理与信息检索数据可视化评分标准FAQ实验二&#xff1a;在线评测系统实验概述实验内容Step1&#xff1a;题目管理Step2&#xff1a;题目评测S…

Linux操作系统从入门到实战(十)Linux开发工具(下)make/Makefile的推导过程与扩展语法

Linux操作系统从入门到实战&#xff08;十&#xff09;Linux开发工具&#xff08;下&#xff09;make/Makefile的推导过程与扩展语法前言一、 make/Makefile的推导过程1. 先看一个完整的Makefile示例2. make的工作流程&#xff08;1&#xff09;寻找Makefile文件&#xff08;2&…

NFS磁盘共享

步骤&#xff1a;注意事项‌&#xff1a;确保服务端防火墙关闭&#xff0c;或者允许2049端口通信&#xff0c;客户端需具备读写权限。服务器端安装NFS服务器&#xff1a;sudo apt-get install nfs-kernel-server # Debian/Ubuntu sudo yum install nfs-utils # Ce…

ORA-06413: 连接未打开

System.Data.OracleClient.OracleException:ORA-06413: 连接未打开 oracle 报错 ORA-06413: 连接未打开 db.Open();的报错链接未打开&#xff0c;System.Data.OracleClient.OracleException HResult0x80131938 MessageORA-06413: 连接未打开 关于ORA-06413错误&#xff08;…

【PCIe 总线及设备入门学习专栏 5.1.2 -- PCIe EP core_rst_n 与 app_rst_n】

文章目录 app_rst_n 和 core_rst_n 的作用1. core_rst_n — PCIe 控制器内部逻辑复位作用控制方式2. app_rst_n — 应用层/用户逻辑复位作用特点两者关系图示:示例流程(Synopsys EP)rst_sync[3] 的作用详解(复位同步逻辑)为什么使用 rst_sync[3]?图示说明Synopsys 官方手…

Python初学者笔记第二十期 -- (文件IO)

第29节课 文件IO 在编程中&#xff0c;文件 I/O&#xff08;输入/输出&#xff09;允许程序与外部文件进行数据交互。Python 提供了丰富且易用的文件 I/O 操作方法&#xff0c;能让开发者轻松实现文件的读取、写入和修改等操作。 IO交互方向 从硬盘文件 -> 读取数据 -> 内…

Java JUC包概述

Java 的 java.util.concurrent&#xff08;简称 JUC&#xff09;包是 JDK 5 及以后引入的并发编程工具包&#xff0c;旨在解决传统线程模型&#xff08;如 synchronized、wait/notify&#xff09;的局限性&#xff0c;提供更灵活、高效、可扩展的并发编程组件。它极大简化了多线…