基于Python实现的图片贝叶斯分类器分类

article/2025/10/15 20:01:09

使用流程及应用展示:

1. 选择图片:

  • 控制台版本从命令行输入

在这里插入图片描述

当直接回车时将读取默认路径图片(./assets/生活照-武.jpg),相对路径是从打开程序的文件夹开始的,若输入路径无效或不可读将继续询问输入

  • GUI 从文件浏览器选择

    也可以直接在输入框输入,当确认选择后点下一继续

2. 选择分类基准点

  • 控制台在命令行输入

    输入格式为’x, y’,即输入横坐标加逗号加纵坐标,前后及坐标逗号间空格均无严格要求,回车录入一个点的坐标,至少输入两个点后,直接回车结束输入,也可以继续输入更多的点。若一个点都不输入的情况下直接回车,会自动在图片路径下查找同名的 CSV 数据文件,从中读入坐标点。对于无效的输入会给出提示,并重新输入该点。

    输入完毕后,会在 图片上标出选取的基准坐标点,询问是否可以继续。若检测到用户输入关键词“否”、“不”、“N”,“n”,则重新录入,否则继续下一步,

  • GUI 在图片上点选

    鼠标移动到图片上可以看到当前坐标,点击左键即可录入该点,至少录入两点后,右侧会出现下一步按钮,可以点击进行下一步,当然也可以继续选择

3. 开始分类

  • 控制台分类

    这没啥好解释的,等待进度条到 100% 分类完毕就好了

  • GUI 分类

    同样没啥好解释的,等图片分类完毕就好了

4. 特征空间绘制

  • 控制台输入取样平方数量

    取样平方数量是为了防止图片较大的情况下绘制的点过多,这里输入了 80,表示长宽方向各取 80 个点,即总共抽取 80 × 80 = 6400 个点来绘制特征空间。默认值如图,100。

  • GUI 输入平方采样数量

    同控制台版本,这里取了默认值 100,即绘制了 10000 个样本点。且这里的坐标轴方向才是默认的坐标轴方向,x、y、z 轴沿右手螺旋方向首尾相接,之前那个图里的坐标轴是我扰数值轴顺时针旋转 90 度了的。

理论详解 & 问题讨论

首先,题目要求为将图片分成 4 类,但我这里的设计实际上可以分成任意多的类(大于等于 2)

假设条件为每类别先验概率相等,具体怎么个相等法我也不知道,既然是假设,那就干脆由用户输入好了,所以设计就变成了用户随便输入几个分类的基准坐标点,因为假设先验概率相等所以我就不验证用户选择的这几个点是否合理咯,如果他真的就选了几个色值相近的点那也没办法。

然后开始对图片分类,这里我只取了 RGB 作为特征值,忽略了 Alpha 通道,一方面很多图片本身就是没有透明度的,另一方面只有 3 个坐标轴也方便后面的特征空间的绘制,不然四维特征空间怎么画?难不成用时间轴代替 Alpha 轴做成动画?(手动滑稽)

分类完成后就是特征空间的绘制了。这里遇到的问题就是当取样的点太多时,Python 的 Matplotlib 库有点响应不过来,所以加入了“平方取样数量”这个概念,简单的说就是如果这个值为 100 那么我就在长宽方向上各等距划分 100 个点,总计得到 100 的 2 次方即 10000 个样本点,然后绘制它们的特征矢量。

作品完成后我们看到,对于我自己的照片,分类效果不是很好,但对于 CG 插画效果就很棒。原因大概是,照片较模糊,每个肉眼可识别的点上其实由多个不尽相同的像素构成,而分类时这些像素就会时而分入 A 类时而分入 B 类,造成较大的噪点。CG 插画是计算机上色,颜色干净,饱和度高,分类效果自然就好多了。

最后,展示下当分类点足够多时的效果!


http://chatgpt.dhexx.cn/article/bndHpDsY.shtml

相关文章

【贝叶斯分类4】贝叶斯网

文章目录 1. 半朴素贝叶斯分类器知识回顾2. 贝叶斯网学习笔记2.1 引言2.2 知识卡片2.3 概率图模型(PGM)2.3.1 引言2.3.2 为什么引入概率图?2.3.3 概率图的三个基本问题(表示,学习,推断) 2.4 贝叶斯网2.4.1 贝叶斯网的表达2.4.2 结…

机器学习算法-朴素贝叶斯分类

机器学习算法--朴素贝叶斯分类 引入贝叶斯决策论条件概率和全概率公式贝叶斯推断和朴素贝叶斯推断拉普拉斯平滑 代码实例1、言论过滤器2、垃圾邮件过滤器 代做 引入 贝叶斯决策论(Bayesian decision theory)是概率论框架下实施决策的基本方法。对分类任务来说,在所有…

【ML】贝叶斯分类和朴素贝叶斯分类

一、介绍 贝叶斯定理是英国数学家托马斯贝叶斯提出的,为了解决一个“逆概率”问题。 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种…

机器学习之朴素贝叶斯分类

朴素贝叶斯分类 贝叶斯定理和基础概率论朴素贝叶斯高斯朴素贝叶斯,多项式朴素贝叶斯,伯努利朴素贝叶斯的区别几种朴素贝叶斯实战总结 贝叶斯定理和基础概率论 概率,其实在我们生活中十分常见,它是对未来事件发生可能性的表述&…

机器学习--朴素贝叶斯分类函数

一、前言 朴素贝叶斯算法是有监督的学习算法,解决的是分类问题,如客户是否流失、是否值得投资、信用等级评定等多分类问题。该算法的优点在于简单易懂、学习效率高、在某些领域的分类问题中能够与决策树、神经网络相媲美。但由于该算法以自变量之间的独…

机器学习之贝叶斯算法图像分类

数据集:数据集采用Sort_1000pics数据集。数据集包含1000张图片,总共分为10类。分别是人(0),沙滩(1),建筑(2),大卡车(3),恐龙&#xff…

使用 Python 进行朴素贝叶斯分类

定义 在机器学习中,贝叶斯分类器是一种简单的概率分类器,它基于应用贝叶斯定理。朴素贝叶斯分类器使用的特征模型做出了很强的独立性假设。这意味着一个类的特定特征的存在与其他所有特征的存在是独立的或无关的。 独立事件的定义: 两个事件…

数据分类《二》贝叶斯分类

本博客是参考《数据仓库与数据挖掘技术》以及诸多道友的blog。仅作为自己学习的一个总结。 贝叶斯分类是一种基于统计学的分类方法,可以预测一个类成员关系的可能性。数据挖掘主要使用两种分类,朴素贝叶斯和贝叶斯网络方法。前者使用贝叶斯进行预测&…

贝叶斯分类及其代码

学期末的综述报告我选择了贝叶斯分类,既然已经写了就将它分享一下。 主要目的就是以教促学。 如有问题欢迎在评论区进行讨论。 随着现代社会信息技术的发展,对于数据的挖掘越来越重要,分类是数据挖掘中应用领域极其广泛的技术之一[1]&#…

栈和队列、

目录 1、栈: 1.1、栈的概念及结构: 1.2、栈的实现: 1.2.1、test.c源文件: 1.2.2、Stack.c源文件: 1.2.3、Stack.h头文件: 1.3、例题1: 2、队列: 2.1、队列的概念及结构&…

栈和队列——表达式求值大全

表达式求值 一.关于三种表达式的分类 中缀表达式:即我们最为常见的表达式,运算符号位于参与运算的连个操作数中间的表达式称作中缀表达式前缀表达式:前缀表达式是一种没有括号的算术表达式,与中缀表达式不同的是,其将…

栈与队列-

基础 stl中栈和队列不是容器,而是容器适配器。它们提供接口,由其他容器实现。 20. 有效的括号 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否…

数据结构----栈和队列

xdm这玩意我不会导入,只能截图了。 目录 栈篇 1.1栈 1.2.栈操作数据元素的两种动作: 2.代码实现 2.1初始化和销毁 2.2插入 2.3删除和判空 2.4返回栈顶值,计算栈长 队列篇 3.1队列 4.代码实现 4.1初始化和销毁和判空 4.2入列 4.3出列 4.4…

栈(Stack)和队列(Queue)详解

1. 什么是栈,栈存储结构详解 同顺序表和链表一样,栈也是用来存储逻辑关系为 “一对一” 数据的线性存储结构,如图 1 所示。 图 1 栈存储结构示意图 从图 1 我们看到,栈存储结构与之前所学的线性存储结构有所差异,这缘…

栈和队列--栈

1、顺序栈 一组地址连续的存储单元加一个标识栈顶元素的指针。 #define MaxSize 50 //定义栈中最大元素个数 typedef struct{ ElemType data[MaxSize];//存放栈中的元素int Top;//栈顶指针 }SqStack;栈空:s.top-1 栈满:s.topMaxSize-1 栈长&#xff…

什么是栈?什么是队列?栈与队列的特点

栈 栈(Stack)是限定在仅在表尾插入的线性表。 因此对于栈来说,表尾具有特殊的含义。我们把表尾称作栈顶(top),把表头称作栈底(bottom)。不含元素的栈称为空栈。 想象一下进栈的顺序…

栈和队列——相关例题

文章目录 一、栈例题——模拟栈具体实现1. 模板1.1 代码注解1.2 实现代码 2. STL2.1 代码注解2.2 实现代码 二、栈例题——表达式求值具体实现1. 实现思路2. 代码注解3. 实现代码 三、单调栈例题——单调栈具体实现1. 实现思路2. 实现代码 四、队列例题——模拟队列具体实现1. …

【栈和队列】

大家好,这里是针对栈和队列做的一些总结归类,主要是介绍了栈和队列的相关操作,特意整理出来一篇博客供我们一起复习和学习,如果文章中有理解不当的地方,还希望朋友们在评论区指出,我们相互学习,共同进步! 文章目录 一:栈1.1 栈的概念及结构1.2 栈的实现1.3 典型案例…

栈、队列

顺序栈,即栈的顺序存储结构是利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素,同时附设指针top指示栈项元素在顺序栈中的位置。通常的习惯做法是以top=0表示空栈,鉴于C语言中数组的下标约定从0开始,则当以C…

栈、队列、数组

栈 定义 #include <stdio.h>/* 栈只允许在栈顶插入删除操作的线性表Last Insert First Out. */// 顺序栈#define MaxSize 10typedef struct {int data[MaxSize]; // 静态数组存放栈元素int top; // 栈顶指针 } SqStack; 栈顶指针指向栈顶元素的栈 空为-1 // 栈顶指针指…