模式识别作业:颜色算子的三种阈值分割算法

一、引言:

在图像处理中,我们往往需要提取图像的一些关键信息,比如本篇文章的内容——提取颜色,然而当我们需要提取某一种颜色时,无论图像余下的部分如何“丰富多彩”,他们都不再重要,需要被忽略,我们称其为“背景”。此时我们只需要黑白图像就可以清晰的展示出需要提取的颜色。我们往往将每个像素点的灰度值转换为0或1,表示黑色或白色,从而将图像转换为黑白二色,这样的图像被称为二值化图像

借助 OpenCV 的 inRange 函数我们就可以根据阈值提取满足条件的像素。

二、RGB 颜色阈值算子

1 RGB空间:

还记得第一篇文章提到的张量么,一张彩色图片可以看作一个三阶张量,即一张彩色图像是由红,绿,蓝三张图片叠加成的,每张图片的有无数的像素点,每个像素点的值域为0~255来表示颜色深浅。这就是最常用的三通道颜色空间,RGB空间。

2 代码实现:

import cv2
import numpy as npdef color_threshold(image, lower_threshold, upper_threshold):"""RGB颜色阈值算子参数:- image: 输入的RGB图像- lower_threshold: 低阈值,为一个包含三个元素的列表或元组,分别对应BGR通道的最小值- upper_threshold: 高阈值,为一个包含三个元素的列表或元组,分别对应BGR通道的最大值返回值:- thresholded_image: 经过阈值处理后的二值图像"""# 使用OpenCV的inRange函数根据阈值提取满足条件的像素thresholded_image = cv2.inRange(image, np.array(lower_threshold), np.array(upper_threshold))return thresholded_image# 主函数
if __name__ == "__main__":# 读取输入图像input_image = cv2.imread("leaf.jpg")# 定义颜色阈值lower_threshold = [0, 100, 0]  # 低阈值,例如,过滤掉B通道小于0,G通道小于100,R通道小于0的像素upper_threshold = [50, 255, 50]  # 高阈值,例如,过滤掉B通道大于50,G通道大于255,R通道大于50的像素# 应用颜色阈值算子thresholded_image = color_threshold(input_image, lower_threshold, upper_threshold)# 显示原始图像和处理后的二值图像cv2.imshow("Original Image", input_image)  # imshow用于新建弹窗显示图像cv2.imshow("Thresholded Image", thresholded_image)cv2.waitKey(0)  # 保留弹窗直至检测到其他键盘操作cv2.destroyAllWindows()

3 运行结果:

三、HSV 颜色阈值算子

1 HSV空间:

HSV空间指的是色彩空间中的一种,由色相(Hue)、饱和度(Saturation)和明度(Value)三个要素组成。色相表示颜色的基本属性,饱和度表示颜色的纯度或深浅程度,而明度则表示颜色的亮度。

2 代码实现:

import cv2
import numpy as npdef hsv_threshold(image, lower_hsv, upper_hsv):"""使用HSV颜色空间进行颜色阈值分割参数:image: 输入的RGB图像lower_hsv: HSV颜色空间下的下限阈值,格式为(H_MIN, S_MIN, V_MIN)upper_hsv: HSV颜色空间下的上限阈值,格式为(H_MAX, S_MAX, V_MAX)返回:thresholded_image: 分割后的二值图像"""# 将RGB图像转换为HSV颜色空间hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 设置阈值范围lower = np.array(lower_hsv)upper = np.array(upper_hsv)# 根据阈值进行二值化处理thresholded_image = cv2.inRange(hsv_image, lower, upper)return thresholded_image# 主函数
if __name__ == "__main__":# 读取图像image = cv2.imread("apple.jpg")# 定义想要提取的HSV颜色范围lower_colour = (40, 100, 100)upper_colour = (80, 255, 255)# 使用阈值算子分割图像colour_threshold = hsv_threshold(image, lower_colour, upper_colour)# 显示原始图像和分割后的图像cv2.imshow("Original Image", image)  # imshow用于新建弹窗显示图像cv2.imshow("colour Threshold", colour_threshold)cv2.waitKey(0)  # 保留弹窗直至检测到其他键盘操作cv2.destroyAllWindows()

3 运行结果:

四、CIE Lab 颜色阈值算子

1 lab空间:

LAB空间是一种色彩空间,也称为CIE LAB色彩空间。它包含三个坐标轴:L表示亮度(Lightness),a表示从洋红色(红色的负轴)到绿色(绿色的正轴)的范围,b表示从蓝色(蓝色的负轴)到黄色(黄色的正轴)的范围。

2 代码实现:

import numpy as np
import cv2def lab_color_threshold(image, lower_bound, upper_bound):"""使用CIE Lab颜色空间进行阈值分割参数:image: 输入的RGB图像lower_bound: 一个包含3个元素的列表,表示颜色的下界(L, a, b)upper_bound: 一个包含3个元素的列表,表示颜色的上界(L, a, b)返回:thresholded: 二值图像,仅包含在指定颜色范围内的区域"""# 将RGB图像转换为CIE Lab颜色空间lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)# 提取L、a、b通道L, a, b = cv2.split(lab_image)# 创建空的二值图像thresholded = np.zeros_like(L)# 将颜色通道与阈值进行比较,生成二值图像within_bounds = (lower_bound[0] <= L) & (L <= upper_bound[0]) & \(lower_bound[1] <= a) & (a <= upper_bound[1]) & \(lower_bound[2] <= b) & (b <= upper_bound[2])# 将满足条件的像素设置为255(白色)thresholded[within_bounds] = 255return thresholded# 主函数
if __name__ == "__main__":# 读取图像image = cv2.imread("apple.jpg")# 设置阈值范围(这里使用的是示例值,你可以根据需要调整)lower_bound = [0, 128, 128]  # L, a, b 的下界upper_bound = [255, 255, 255]  # L, a, b 的上界# 应用颜色阈值算子thresholded_image = lab_color_threshold(image, lower_bound, upper_bound)# 显示结果cv2.imshow("Original Image", image)  # imshow用于新建弹窗显示图像cv2.imshow("Thresholded Image", thresholded_image)cv2.waitKey(0)  # 保留弹窗直至检测到其他键盘操作cv2.destroyAllWindows()

3 运行结果:

五、优缺点对比

1 RGB优缺点:

(1)优点:

  1. 直接对应于显示器和相机的工作原理,易于理解和实现。
  2. 在处理彩色图像时,RGB是一种直观的颜色表示方式。

(2)缺点:

  1. RGB模型对光照和阴影等因素较为敏感,不太适合于需要考虑光照条件的任务。
  2. RGB模型下的颜色值不够直观,不易于对颜色的特性进行准确描述。
  3. 某些情况下,RGB模型下的颜色空间变换不够灵活,无法有效地处理一些特定的颜色操作。

2 HSV优缺点:

(1)优点:

  1. HSV模型更符合人类对颜色的感知,色相、饱和度和明度的概念更直观。
  2. 色相分量可以独立于光照条件而保持不变,因此HSV对光照条件的影响较小。
  3. 在某些任务中,如颜色识别和区分不同颜色的对象,HSV模型可能更有效。

(2)缺点:

  1. HSV模型的计算量较大,不够简洁高效,对计算资源要求较高。
  2. HSV模型不是设备无关的,可能会受到设备性能和环境光照的影响。
  3. 在一些情况下,HSV模型下的颜色分布不均匀,可能导致某些区域难以区分或处理。

3 LAB优缺点:

(1)优点:

  1. LAB模型是一种设备无关的颜色空间模型,颜色值在不同设备和环境下保持一致。
  2. LAB模型更符合人类视觉系统的感知特性,对颜色的描述更准确。
  3. LAB模型可以很好地处理颜色校正和颜色匹配等任务。

(2)缺点:

  1. LAB模型的数学计算较复杂,相比RGB和HSV模型,计算量较大。
  2. 有时,LAB模型下的颜色表示不够直观,不够直观地反映颜色在图像中的分布情况。
  3. 由于LAB模型对颜色的描述较为细致,可能会导致在某些情况下对颜色的处理和分析更加复杂。

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

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

相关文章

如何使用SSH密钥克隆仓库

1.创建SSH Key 在用户目录下查看有没有.ssh目录。如果有且该.ssh目录下有id_rsa&#xff08;私钥&#xff09;&#xff0c;和id_rse_pub(公钥)这俩文件&#xff0c;那么这一步就可以跳过。否则使用以下指令创建SSH Key ssh-keygen -t rsa -C "xxxqq.com" "xx…

8.k8s中网络资源service

目录 一、service资源概述 二、service资源类型 1.ClusterIP类型 2.service的nodeport类型 3.service的loadbalancer类型&#xff08;了解即可&#xff09; 4.service的externalname类型&#xff08;了解即可&#xff09; 三、nodeport的端口范围设置和svc的endpoint列表 1.修…

AJAX概述和基本使用

01 【AJAX概述和基本使用】 1.AJAX简介 AJAX 全称为Asynchronous JavaScript And XML&#xff0c;就是异步的JS 和XML 通过AJAX 可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无刷新获取数据 AJAX 不是新的编程语言&#xff0c;而是一种将现有的标准…

刷代码随想录有感(53):合并二叉树

题干&#xff1a; 代码&#xff08;递归实现&#xff09;&#xff1a; TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {//前序好理解&#xff0c;直接将树覆盖到另一个上面if(root1 NULL)return root2;//当前遍历节点为空的话就让另一个的值覆盖过来if(root2 NUL…

对命令模式的理解

目录 一、场景1、文本编辑器并不是一个好的例子&#xff0c;设备控制器才是2、设备控制器的demo 二、不用命令模式1、代码2、问题 三、使用命令模式1、代码2、当需求变化时2.1 新增代码2.2 优点 四、进一步思考1、省略对Command的建模可以吗&#xff1f;2、命令模式的价值 一、…

GDPU unity游戏开发 碰撞器与触发器

砰砰叫&#xff0c;谁动了她的奶酪让你的小鹿乱撞了。基于此&#xff0c;亦即碰撞与触发的过程。 碰撞器与触发器的区别 通俗点讲&#xff0c;碰撞器检测碰撞&#xff0c;触发器检测触发&#xff0c;讲了跟没讲似的。碰撞器是用来检测碰撞事件的&#xff0c;在unity中&#xff…

蓝桥杯练习系统(算法训练)ALGO-949 勇士和地雷阵

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 勇士们不小心进入了敌人的地雷阵&#xff08;用n行n列的矩阵表示&#xff0c;*表示某个位置埋有地雷&#xff0c;-表示某个…

yolov5-pytorch-Ultralytics训练+预测+报错处理记录

一、前言 玩一段时间大模型&#xff0c;也该回归一下图像识别。本项目用于记录使用基于Ultralytics的yolov5进行目标检测测试。为什么用Ultralytics呢&#xff1f;答案有3 1、其良好的生态&#xff0c;方便我们部署到其它语言和设备上。因此本次测试结论&#xff1a;大坑没有&…

UE5 蓝图入门

基础节点创建&#xff1a; 常量&#xff1a; 按住 1 &#xff0c;点击鼠标左键&#xff0c;创建常量 二维向量&#xff1a; 按住 2 &#xff0c;点击鼠标左键&#xff0c;创建二维向量 三维向量&#xff1a; 按住 3 &#xff0c;点击鼠标左键 乘法&#xff1a; 按住 m 键…

基于node.js+css+html+mysql博客系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、Php、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

Vue进阶之Vue项目实战(一)

Vue项目实战 项目搭建初始化eslint版本约束版本约束eslint配置 stylelintcspellcz-githusky给拦截举个例子 zx 项目搭建 node版本&#xff1a;20.11.1 pnpm版本&#xff1a;9.0.4 初始化 vue3最新的脚手架 pnpm create vite byelide-demo --template vue-ts pnpm i pnpm dev…

MIPS32 指令架构

指令格式 R 类型 说明&#xff1a; 用于寄存器和寄存器操作 参数说明: Op: 指令操作码Rs: 第一个源操作数寄存器号&#xff0c;参与运算使用Rd: 目的操作数寄存器号&#xff0c;保存结果使用Shamt: 位偏移量&#xff0c;仅在位移指令使用&#xff0c;在此直接置0Func: 指令函…

深入 Django 模型层:数据库设计与 ORM 实践指南

title: 深入 Django 模型层&#xff1a;数据库设计与 ORM 实践指南 date: 2024/5/3 18:25:33 updated: 2024/5/3 18:25:33 categories: 后端开发 tags: Django ORM模型设计数据库关系性能优化数据安全查询操作模型继承 第一章&#xff1a;引言 Django是一个基于Python的开源…

【C++】深入剖析C++11中右值引用和左值引用

目录 一、左值引用 && 右值引用 二、左值引用于右值引用的比较 三、 右值引用使用场景和意义 1、函数返回值 ①移动赋值 ②移动构造 2、STL容器插入接口 ​3、完美转发 一、左值引用 && 右值引用 传统的C语法中就有引用的语法&#xff0c;而C11中新增了…

【简单介绍下Lisp的学习历程】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

Mybatis之Sqlsession、Connection和Transaction三者间的关系

前言 最近在看Mybatis的源码&#xff0c;搜到这篇文章Sqlsession、Connection和Transaction原理与三者间的关系&#xff0c;debug之后发现有不少疑惑&#xff0c;于是按照原文整理了一下&#xff0c;记录下debug中的一些困惑点。 对于我们开发来讲&#xff0c;不管跟任何关系…

django搭建一个AI博客进行YouTube视频自动生成文字博客

文章目录 一、生成Django框架二、项目代码&#xff08;前端&#xff09;1、编写前端代码&#xff08;正文界面&#xff09;1.1、生产html框架1.2、添加live preview扩展1.3、更改title元素中文本1.4、添加CDN&#xff08;CSS&#xff09;样式链接1.5、nav标签1.6、在body标签中…

Python | Leetcode Python题解之第66题加一

题目&#xff1a; 题解&#xff1a; class Solution:def plusOne(self, digits: List[int]) -> List[int]:n len(digits)for i in range(n - 1, -1, -1):if digits[i] ! 9:digits[i] 1for j in range(i 1, n):digits[j] 0return digits# digits 中所有的元素均为 9retu…

手撸Mybatis(三)——收敛SQL操作到SqlSession

本专栏的源码&#xff1a;https://gitee.com/dhi-chen-xiaoyang/yang-mybatis。 引言 在上一章中&#xff0c;我们实现了读取mapper配置并构造相关的mapper代理对象&#xff0c;读取mapper.xml文件中的sql信息等操作&#xff0c;现在&#xff0c;在上一章的基础上&#xff0c…

深度学习:基于TensorFlow、Keras,使用长短期记忆神经网络模型(LSTM)对Microsoft股票进行预测分析

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…