程序代码篇---项目目录结构HSV掩膜Opencv图像处理


文章目录

  • 前言
  • 第一部分:项目目录结构
  • 第二部分:HSV提取
    • HSV
      • 色调(Hue)
        • 含义
        • 取值范围
      • 饱和度(Saturation)
        • 含义
        • 取值范围
      • 亮度(Value)
        • 含义
        • 取值范围
  • 第三部分:Opencv图像处理
    • 1. 读取和显示图像
    • 2. 转换颜色空间
    • 3. 边缘检测
    • 4. 形态变换
    • 5. 图像阈值
    • 6. 图像平滑
    • 7. 图像轮廓
  • 总结


前言

以上就是今天要讲的内容,本文简单介绍了项目目录结构、HSV掩膜、Opencv图像处理


第一部分:项目目录结构

一个程序项目的目录结构对于项目的组织、维护和扩展至关重要。一个清晰、合理的目录结构可以使项目更容易理解、协作和部署。以下是一个典型的程序项目目录结构,适用于多种编程语言和项目类型:

project-name/
│
├── README.md           # 项目说明文件(***)
├── LICENSE             # 项目许可证文件
├── .gitignore          # Git 版本控制忽略规则文件
├── .editorconfig       # 编辑器配置文件
├── .git                # 版本控制目录(Git)
│
├── docs                # 项目文档目录(***)
│   ├── development.md  # 开发文档(***)
│   ├── usage.md        # 使用说明(***)
│   └── ...             # 其他文档
│
├── src                 # 源代码目录(***)
│   ├── main.py         # 主程序入口(***)
│   ├── config          # 配置文件和目录(***)
│   │   └── settings.py # 配置设置
│   ├── utils           # 工具类和辅助函数(***)
│   │   └── helpers.py
│   ├── models          # 数据模型(***)
│   │   └── user.py
│   ├── views           # 视图层(MVC模式)
│   │   └── index.py
│   ├── controllers     # 控制器层(MVC模式)
│   │   └── auth.py
│   └── tests           # 测试代码目录(***)
│       ├── unit        # 单元测试
│       └── integration # 集成测试
│
├── static              # 静态文件目录,如CSS、JavaScript、图片等(***)
│   ├── css
│   ├── js
│   └── images(***)
│
├── templates           # 模板文件目录(用于Web项目)
│   ├── base.html
│   └── index.html
│
├── scripts             # 构建脚本或工具脚本(***)
│   ├── build.sh
│   └── deploy.sh
│
├── requirements.txt    # 项目依赖列表(Python项目)(***)
├── package.json        # 项目依赖和配置(Node.js项目)
├── package-lock.json   # 依赖锁定文件(Node.js项目)
└── vendor              # 第三方库或代码(某些语言的项目)

以下是各个目录和文件的简要说明:

  1. README.md: 项目的说明文档,通常包含如何安装、配置和使用项目的信息。
  2. LICENSE: 项目的许可证文件,说明了项目的使用、修改和分发条件。
  3. .gitignore: 列出了Git版本控制系统中需要忽略的文件和目录。
  4. .editorconfig: 提供了跨编辑器和IDE的代码风格统一配置。
  5. docs: 项目文档目录,用于存放开发文档、用户手册等。
  6. src: 源代码目录,是项目的主要开发区域。
    main.py: 程序的主入口文件。
    config: 配置文件和目录。
    utils: 工具类和辅助函数。
    models: 数据模型。
    views: 视图层,通常用于Web应用中的模板渲染。
    controllers: 控制器层,处理业务逻辑。
    tests: 测试代码目录,通常分为单元测试和集成测试。
  7. static: 存放静态文件,如CSS样式表、JavaScript脚本和图片等。
  8. templates: 存放模板文件,通常用于Web项目中的HTML模板。
  9. scripts: 存放构建脚本、部署脚本或其他自动化脚本
  10. requirements.txt: Python项目的依赖列表。
  11. package.json: Node.js项目的依赖和配置。
  12. package-lock.json: Node.js项目的依赖锁定文件。
  13. vendor: 存放第三方库或代码,这在某些编程语言的项目中很常见。

第二部分:HSV提取

在Python中,使用OpenCV库进行图像处理时,创建HSV(Hue, Saturation, Value)掩膜是一个常见的操作。通过HSV颜色空间,我们可以更轻松地分割出图像中特定颜色的区域滑动条(Trackbar)可以用来动态调整HSV掩膜参数。

以下是一个使用OpenCV创建HSV掩膜,并通过滑动条动态调整参数的示例程序。

import cv2
import numpy as np#初始化滑动条的默认值
hue_low = 0
hue_high = 179
sat_low = 0
sat_high = 255
val_low = 0
val_high = 255#创建一个回调函数,这个函数会在滑动条被调整时被调用
def nothing(x):pass#创建一个窗口用于显示结果
cv2.namedWindow('image')#创建滑动条
cv2.createTrackbar('Hue Low', 'image', hue_low, 179, nothing)
cv2.createTrackbar('Hue High', 'image', hue_high, 179, nothing)
cv2.createTrackbar('Sat Low', 'image', sat_low, 255, nothing)
cv2.createTrackbar('Sat High', 'image', sat_high, 255, nothing)
cv2.createTrackbar('Val Low', 'image', val_low, 255, nothing)
cv2.createTrackbar('Val High', 'image', val_high, 255, nothing)#读取图像
cap = cv2.VideoCapture(0)while True:# 读取帧ret, frame = cap.read()if not ret:break# 将图像从BGR颜色空间转换到HSV颜色空间hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)# 获取滑动条的当前值hue_low = cv2.getTrackbarPos('Hue Low', 'image')hue_high = cv2.getTrackbarPos('Hue High', 'image')sat_low = cv2.getTrackbarPos('Sat Low', 'image')sat_high = cv2.getTrackbarPos('Sat High', 'image')val_low = cv2.getTrackbarPos('Val Low', 'image')val_high = cv2.getTrackbarPos('Val High', 'image')# 创建掩膜lower_bound = np.array([hue_low, sat_low, val_low])upper_bound = np.array([hue_high, sat_high, val_high])mask = cv2.inRange(hsv, lower_bound, upper_bound)# 将掩膜应用到原图像上result = cv2.bitwise_and(frame, frame, mask=mask)# 显示结果cv2.imshow('image', result)# 按'q'键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break#释放摄像头
cap.release()
#关闭所有OpenCV窗口
cv2.destroyAllWindows()

在这个程序中,nothing函数是一个回调函数。回调函数是当某个事件发生时,由系统自动调用的函数。在这个例子中,滑动条的值被改变时,OpenCV会自动调用nothing函数。但是,这个函数实际上并不执行任何操作,它的存在只是为了满足OpenCV创建滑动条时对回调函数的需求

以下是程序中重要部分的解释:

  1. cv2.createTrackbar函数用于创建滑动条。它需要滑动条的名称、所在的窗口名称、默认值、最大值和回调函数
  2. cv2.getTrackbarPos函数用于获取滑动条的当前值
  3. cv2.inRange函数用于创建掩膜,它根据HSV范围过滤出特定颜色的区域。
  4. cv2.bitwise_and函数用于将掩膜应用到原图像上,只显示掩膜内的图像部分。
    在这个程序中,我们不需要回调函数执行任何操作,因为我们通过cv2.getTrackbarPos函数在主循环中获取滑动条的值,并根据这些值更新掩膜。如果需要在滑动条值改变时执行特定的操作,可以在nothing函数中添加相应的代码。

HSV

HSV(Hue, Saturation, Value)颜色模型是一种将RGB颜色模型中的颜色分解为色调(Hue)、饱和度(Saturation)和亮度(Value)三个分量的方式。以下是HSV三个参数的含义及其取值范围:

色调(Hue)

含义

含义:色调是色彩的基本属性,它反映了颜色的种类,例如红色、绿色或蓝色。在HSV颜色模型中,色调是通过颜色轮来表示的,不同的角度代表不同的颜色。

取值范围

取值范围:通常色调的取值范围是从0到360度(在一些实现中,如OpenCV,色调的取值范围是从0到179,因为它是按照色轮的256等分来计算的)。

饱和度(Saturation)

含义

含义:饱和度表示颜色的纯度,它描述了颜色中灰度成分的多少。饱和度越高,颜色看起来越鲜艳;饱和度越低,颜色看起来越灰暗。

取值范围

取值范围:饱和度的取值范围通常是0到100%,但在OpenCV中,它的取值范围是从0到255

亮度(Value)

含义

含义:亮度代表了颜色的明亮程度,也可以理解为颜色被照亮的程度。亮度越高,颜色越接近白色;亮度越低,颜色越接近黑色。

取值范围

取值范围:亮度的取值范围也是从0到100%,在OpenCV中,它的取值范围是从0到255。
总结一下,在OpenCV中,HSV颜色模型的取值范围如下:

色调(H):0到179
饱和度(S):0到255
亮度(V):0到255

这种表示方法使得HSV颜色模型在图像处理中特别有用,尤其是在需要分离颜色和亮度信息的情况下。例如,**通过调整色调,我们可以选择图像中的特定颜色;****通过调整饱和度,我们可以选择颜色的深浅;**通过调整亮度,我们可以选择图像中的明亮或暗淡区域。

第三部分:Opencv图像处理

在图像处理领域,OpenCV是一个广泛使用的开源库,它提供了大量的函数来处理和分析图像。以下是一些OpenCV中常见的图像处理函数及其使用流程的详细解释:

1. 读取和显示图像

import cv2#读取图像
image = cv2.imread('path_to_image.jpg')#显示图像
cv2.imshow('Image Window', image)#等待按键后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imread(): 读取图像文件。
cv2.imshow(): 在窗口中显示图像。
cv2.waitKey(): 等待按键事件,参数是毫秒数,0表示无限等待。
cv2.destroyAllWindows(): 关闭所有OpenCV创建的窗口。

2. 转换颜色空间

#将BGR图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#将BGR图像转换为HSV图像
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
cv2.cvtColor(): 将图像从一种颜色空间转换到另一种颜色空间。

3. 边缘检测

#使用Canny算法进行边缘检测
edges = cv2.Canny(image, threshold1, threshold2)
cv2.Canny(): 使用Canny算法检测图像中的边缘。

4. 形态变换

#定义一个核
kernel = np.ones((5,5), np.uint8)#腐蚀操作
erosion = cv2.erode(image, kernel, iterations=1)#膨胀操作
dilation = cv2.dilate(image, kernel, iterations=1)
cv2.erode(): 图像腐蚀,用于缩小前景对象。
cv2.dilate(): 图像膨胀,用于扩大前景对象。

5. 图像阈值

#应用简单的阈值
ret, thresh1 = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)#应用自适应阈值
thresh2 = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
cv2.threshold(): 应用固定阈值到图像上。
cv2.adaptiveThreshold(): 应用自适应阈值到图像上。

6. 图像平滑

#应用高斯模糊
gaussian_blur = cv2.GaussianBlur(image, (5,5), 0)#应用中值模糊
median_blur = cv2.medianBlur(image, 5)
cv2.GaussianBlur(): 使用高斯模糊对图像进行平滑处理。
cv2.medianBlur(): 使用中值模糊对图像进行平滑处理。

7. 图像轮廓

#找到轮廓
contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)#绘制轮廓
cv2.drawContours(image, contours, -1, (0,255,0), 3)
cv2.findContours(): 在二值图像中找到轮廓。
cv2.drawContours(): 在图像上绘制轮廓。

这些函数是OpenCV图像处理的基础,通过组合使用这些函数,可以实现复杂的图像处理任务。每个函数都有其特定的参数和返回值,理解这些参数对于有效地使用OpenCV进行图像处理至关重要。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了项目目录结构、HSV掩膜、Opencv图像处理

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

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

相关文章

【汽车电子软件架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子软件架构:AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风,从概念与定义入手,希望读者能对AutoSAR架构有一个整体的认识,然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…

python-UnitTest框架笔记

UnitTest框架的基本使用方法 UnitTest框架介绍 框架:framework,为了解决一类事情的功能集合 UnitTest框架:是python自带的单元测试框架 自带的,可以直接使用,不需要格外安装 测试人员用来做自动化测试,作…

【数据结构】_链表经典算法OJ:复杂链表的复制

目录 1. 题目链接及描述 2. 解题思路 3. 程序 1. 题目链接及描述 题目链接:138. 随机链表的复制 - 力扣(LeetCode) 题目描述: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,…

Linux——进程间通信之SystemV共享内存

前言 SystemV通信一般包括三种:共享内存、消息队列和信号量。共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到 内核,换句话说是进程不再通过执行进入内核的系统调用来…

Linux网络 | 网络层IP报文解析、认识网段划分与IP地址

前言:本节内容为网络层。 主要讲解IP协议报文字段以及分离有效载荷。 另外, 本节也会带领友友认识一下IP地址的划分。 那么现在废话不多说, 开始我们的学习吧!! ps:本节正式进入网络层喽, 友友们…

SQLGlot:用SQLGlot解析SQL

几十年来,结构化查询语言(SQL)一直是与数据库交互的实际语言。在一段时间内,不同的数据库在支持通用SQL语法的同时演变出了不同的SQL风格,也就是方言。这可能是SQL被广泛采用和流行的原因之一。 SQL解析是解构SQL查询…

Windows程序设计10:文件指针及目录的创建与删除

文章目录 前言一、文件指针是什么?二、设置文件指针的位置:随机读写,SetFilePointer函数1.函数说明2.函数实例 三、 目录的创建CreateDirectory四、目录的删除RemoveDirectory总结 前言 Windows程序设计10:文件指针及目录的创建与…

线程互斥同步

前言: 简单回顾一下上文所学,上文我们最重要核心的工作就是介绍了我们线程自己的LWP和tid究竟是个什么,总结一句话,就是tid是用户视角下所认为的概念,因为在Linux系统中,从来没有线程这一说法,…

DRM系列七:Drm之CREATE_DUMB

本系列文章基于linux 5.15 DRM驱动的显存由GEM(Graphics execution management)管理。 一、创建流程 创建buf时,user层提供需要buf的width,height以及bpp(bite per pixel),然后调用drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &…

我们信仰AI?从神明到人工智能——信任的进化

信任的进化: 信任是我们最宝贵的资产。而现在,它正像黑色星期五促销的廉价平板电视一样,被一点点拆解。在过去,世界很简单:人们相信晚间新闻、那些满是灰尘书籍的教授,或者手持病历、眉头紧锁的医生。而如…

数据分析系列--[11] RapidMiner,K-Means聚类分析(含数据集)

一、数据集 二、导入数据 三、K-Means聚类 数据说明:提供一组数据,含体重、胆固醇、性别。 分析目标:找到这组数据中需要治疗的群体供后续使用。 一、数据集 点击下载数据集 二、导入数据 三、K-Means聚类 Ending, congratulations, youre done.

1-刷力扣问题记录

25.1.19 1.size()和.length()有什么区别 2.result.push_back({nums[i], nums[left], nums[right]});为什么用大括号? 使用大括号 {} 是 C11 引入的 初始化列表 语法,它允许我们在构造或初始化对象时直接传入一组值。大括号的使用在许多情况下都能让代码…

神经网络参数量和运算量的计算- 基于deepspeed库和thop库函数

引言 最近需要对神经网络的参数量和运算量进行统计。找到一个基于deepspeed库函数计算参数量和运算量的例子。而我之前一直用thop库函数来计算。 看到有一篇勘误博文写道使用thops库得到的运算量是MACs (Multiply ACcumulate operations,乘加累积操作次数&#xf…

读书笔记--分布式架构的异步化和缓存技术原理及应用场景

本篇是在上一篇的基础上,主要对分布式应用架构下的异步化机制和缓存技术进行学习,主要记录和思考如下,供大家学习参考。大家知道原来传统的单一WAR应用中,由于所有数据都在同一个数据库中,因此事务问题一般借助数据库事…

无用知识研究:std::initializer_list的秘密

先说结论,用std::initializer_list初始化vector,内部逻辑是先生成了一个临时数组,进行了拷贝构造,然后用这个数组的起终指针初始化initializer_list。然后再用initializer_list对vector进行初始化,这个动作又触发了拷贝…

Jupyterlab和notebook修改文件的默认存放路径的方法

文章目录 1.缘由2.操作流程2.1找到默认的路径2.2创建配置文件2.3修改配置文件内容2.4注意事项 1.缘由 我自己使用jupyterlab的时候,打开是在这个浏览器上面打开的,但是这个打开的文件路径显示的是C盘上面路径,所以这个就很麻烦,因…

HarmonyOS:ArkWeb进程

ArkWeb是多进程模型,分为应用进程、Web渲染进程、Web GPU进程、Web孵化进程和Foundation进程。 说明 Web内核没有明确的内存大小申请约束,理论上可以无限大,直到被资源管理释放。 ArkWeb进程模型图 应用进程中Web相关线程(应用唯一) 应用进程为主进程。包含网络线程、Vi…

基于Spring Security 6的OAuth2 系列之九 - 授权服务器--token的获取

之所以想写这一系列,是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级…

音标-- 02-- 重音 音节 变音

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 国际音标1.重音2.音节3.变音 国际音标 1.重音 2.音节 3.变音

Adaptive LLM Transformer²

看到了一个不错的论文https://arxiv.org/pdf/2501.06252 TRANSFORMER-SQUARED: SELF-ADAPTIVE LLMS 挺有意思的,是一家日本AI公司SakanaAI的论文(我以前写过他们的不训练提升模型的能力的文章,感兴趣可以去翻)它家有Lion Jones坐镇…