传统图像处理Opencv分割不同颜色的夹子

news2024/11/28 14:33:54

任务要求🍉


1. 计算图像中夹子的总数。
2. 分别计算不同颜色夹子的个数。
3. 使用以下方法适应三张图片,并在每张图像上显示结果:
   - 阈值方法
   - HSV颜色空间
   - 连通域分析
   - 形态学图像处理
   - Canny边缘检测
4. 在结果中显示计数后的数字,包括总数和每种颜色的个数。

请学生根据任务要求,编写代码实现夹子计数和颜色分类的功能。学生可以选择使用 Python 和 OpenCV 库来完成任务。他们需要适应三张提供的图像,并在每张图像上显示计数结果。建议学生使用阈值处理、HSV颜色空间转换、连通域分析、形态学图像处理和Canny边缘检测等方法来实现任务要求。

参考🍉

代码: 

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像
img = cv2.imread('test2.jpg')

# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 阈值处理
_, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 将图像转换为HSV颜色空间
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# 定义颜色范围 绿
lower_green = np.array([60, 50, 50])
upper_green = np.array([100, 255, 255])
# 定义颜色范围 蓝
lower_blue = np.array([90, 50, 50])
upper_blue = np.array([130, 255, 255])
# 定义颜色范围 红
lower_red1 = np.array([0, 50, 50])
upper_red1 = np.array([10, 255, 255])
# 定义颜色范围 红
lower_red2 = np.array([170, 50, 50])
upper_red2 = np.array([180, 255, 255])
# 定义颜色范围 黄
lower_yellow = np.array([20, 50, 50])
upper_yellow = np.array([40, 255, 255])

# 创建掩模
mask_green = cv2.inRange(hsv, lower_green, upper_green)
mask_blue = cv2.inRange(hsv, lower_blue, upper_blue)
mask_red1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask_red2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask_red = cv2.bitwise_or(mask_red1, mask_red2)
mask_yellow = cv2.inRange(hsv, lower_yellow, upper_yellow)

# 分割出绿色、蓝色、红色和黄色区域
green_segmented = cv2.bitwise_and(img, img, mask=mask_green)
blue_segmented = cv2.bitwise_and(img, img, mask=mask_blue)
red_segmented = cv2.bitwise_and(img, img, mask=mask_red)
yellow_segmented = cv2.bitwise_and(img, img, mask=mask_yellow)


# 统计连通域数量和面积
_, green_labels, green_stats, _ = cv2.connectedComponentsWithStats(mask_green, connectivity=8)
_, blue_labels, blue_stats, _ = cv2.connectedComponentsWithStats(mask_blue, connectivity=8)
_, red_labels, red_stats, _ = cv2.connectedComponentsWithStats(mask_red, connectivity=8)
_, yellow_labels, yellow_stats, _ = cv2.connectedComponentsWithStats(mask_yellow, connectivity=8)

# 定义像素数量阈值
threshold = 2000

# 筛选出像素数量达到阈值的连通域
green_filtered_labels = [label for label, area in enumerate(green_stats[:, cv2.CC_STAT_AREA]) if area >= threshold]
blue_filtered_labels = [label for label, area in enumerate(blue_stats[:, cv2.CC_STAT_AREA]) if area >= threshold]
red_filtered_labels = [label for label, area in enumerate(red_stats[:, cv2.CC_STAT_AREA]) if area >= threshold]
yellow_filtered_labels = [label for label, area in enumerate(yellow_stats[:, cv2.CC_STAT_AREA]) if area >= threshold]
# 绘制筛选后的连通域边界框
for label in green_filtered_labels:
    x, y, w, h = green_stats[label, cv2.CC_STAT_LEFT], green_stats[label, cv2.CC_STAT_TOP], green_stats[label, cv2.CC_STAT_WIDTH], green_stats[label, cv2.CC_STAT_HEIGHT]
    cv2.rectangle(green_segmented, (x, y), (x + w, y + h), (0, 255, 0), 2)

for label in blue_filtered_labels:
    x, y, w, h = blue_stats[label, cv2.CC_STAT_LEFT], blue_stats[label, cv2.CC_STAT_TOP], blue_stats[label, cv2.CC_STAT_WIDTH], blue_stats[label, cv2.CC_STAT_HEIGHT]
    cv2.rectangle(blue_segmented, (x, y), (x + w, y + h), (0, 0, 255), 2)

for label in red_filtered_labels:
    x, y, w, h = red_stats[label, cv2.CC_STAT_LEFT], red_stats[label, cv2.CC_STAT_TOP], red_stats[label, cv2.CC_STAT_WIDTH], red_stats[label, cv2.CC_STAT_HEIGHT]
    cv2.rectangle(red_segmented, (x, y), (x + w, y + h), (255, 0, 0), 2)

for label in yellow_filtered_labels:
    x, y, w, h = yellow_stats[label, cv2.CC_STAT_LEFT], yellow_stats[label, cv2.CC_STAT_TOP], yellow_stats[label, cv2.CC_STAT_WIDTH], yellow_stats[label, cv2.CC_STAT_HEIGHT]
    cv2.rectangle(yellow_segmented, (x, y), (x + w, y + h), (0, 255, 255), 2)

# print(len(g), len(b),len(r),len(y))
# 显示结果
fig, axs = plt.subplots(3, 2, figsize=(10, 10))

axs[0, 0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
axs[0, 0].set_title('Original Image')

axs[0, 1].imshow(thresh, cmap='gray')
axs[0, 1].set_title('Threshold Image')

axs[1, 0].imshow(cv2.cvtColor(green_segmented, cv2.COLOR_BGR2RGB))
axs[1, 0].set_title(f'Green Segmented ({len(green_filtered_labels)-1} regions)')

axs[1, 1].imshow(cv2.cvtColor(blue_segmented, cv2.COLOR_BGR2RGB))
axs[1, 1].set_title(f'Blue Segmented ({len(blue_filtered_labels)-1} regions)')

axs[2, 0].imshow(cv2.cvtColor(red_segmented, cv2.COLOR_BGR2RGB))
axs[2, 0].set_title(f'Red Segmented ({len(red_filtered_labels)-1} regions)')

axs[2, 1].imshow(cv2.cvtColor(yellow_segmented, cv2.COLOR_BGR2RGB))
axs[2, 1].set_title(f'Yellow Segmented ({len(yellow_filtered_labels)-1} regions)')

plt.tight_layout()
plt.show()

运行结果:  

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

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

相关文章

北交大研究突破:塑料光纤赋能低成本无摄像头AR/VR眼动追踪技术

北交大研究:探索无摄像头低成本AR/VR眼动追踪新路径 在AR/VR技术领域,眼动追踪作为一项关键技术,对于提升用户体验、优化渲染效率具有重要意义。然而,传统的眼动追踪方案多依赖于高成本的摄像头,这不仅增加了设备的制造…

学习资料库系统小程序的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,观看记录管理,基础数据管理,论坛信息管理,公告信息管理,轮播图信息 微信端账号功能包括:系统首页,阅读资…

性能学习5:性能测试的流程

一.需求分析 二.性能测试计划 1)测什么? - 项目背景 - 测试目的 - 测试范围 - ... 2)谁来测试 - 时间进度与分工 - 交付清单 - ... 3)怎么测 - 测试策略 - ... 三.性能测试用例 四.性能测试执行 五.性能分析和调优 六…

【cpp/c++ summary 工具】 conan包管理器安装与cmake项目配置

发现有些包cvpkg中没有(比如字典树),conan里有。 安装conan https://conan.io/downloads 配置conan PS C:\Users\multisim> conan config home C:\Users\multisim\.conan2 # Conan 主文件夹的路径,https://docs.conan.io/2/referen…

【梯级水电站调度优化】基于自适应权值优化粒子群算法

课题名称: 基于改进粒子群算法的梯级水电站调度优化 改进方向:自适应权值优化 代码获取方式(付费): 相关资料: 1. 粒子群算法的基本原理 2. 梯级水电站调度优化模型 3. 代码注释 4. 代码讲解视频&am…

Python编程常用的35个经典案例

Python 的简洁和强大使其成为许多开发者的首选语言。本文将介绍35个常用的Python经典代码案例。这些示例覆盖了基础语法、常见任务、以及一些高级功能。 1.列表推导式 这个例子展示了列表推导式,用于生成FizzBuzz序列。 fizz_buzz_list ["FizzBuzz" i…

互联网Java工程师面试题及答案整理(2024年最新版)

前言 作为一个 Java 程序员,你平时总是陷在业务开发里,每天噼里啪啦忙敲着代码,上到系统开发,下到 Bug 修改,你感觉自己无所不能。然而偶尔的一次聚会,你听说和自己一起出道的同学早已经年薪 50 万&#x…

拥抱大模型时代,从入门到精通,科技从业者的转型攻略与AI红利指南

前言 自2022年11月ChatGPT问世以来,大模型在人工智能领域的潜能得到了充分展示,其深远影响引发了研究热潮。在不到一年的时间里,国产大模型如雨后春笋般涌现,2023年成为了大模型时代的元年。对于IT圈的科技从业者来说&#xff0c…

NextViT实战:使用NextViT实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

从零开始讲PCIe(8)——PCIe拓扑与组件

一、拓扑结构 和PCI-X一样,PCIe链路是点对点的连接,而不是像传统PCI那样使用共享总线。这是由于其使用了非常高的传输速度。因此,链路只能连接两个接口,为了构建一个复杂的系统,必须采用某种方式来扩展连接。在PCIe中&…

《Linux从小白到高手》理论篇:一文概览常用Linux重要配置文件

List item 今天继续宅家,闲来无事接着写。本篇是《Linux从小白到高手》理论篇的最后一篇了。本篇集中介绍所有常用的Linux重要配置文件。 用这个命令可以查看配置文件所在的位置:如上图 locate "*.conf" "*.ini" "*.cfg&quo…

论文 | Model-tuning Via Prompts Makes NLP Models Adversarially Robust

这篇论文研究了使用提示 (Prompting) 方法微调预训练语言模型,以提高其在对抗样本攻击下的鲁棒性。论文的主要贡献如下: 1.MVP 比 MLP-FT 更鲁棒: 论文比较了 MVP (Model-tuning Via Prompts) 和传统的 MLP-FT (Fine-tuning with an MLP head…

热门:AI变现,看看谁在默默赚大钱?

在这个愈发依赖AI的时代,找到属于自己的盈利方式愈发重要。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 总的来说,利用AI进行盈利的方式主要有三种:技术型、流量型和内容型。 每种方式都根植于AI的特性,但同时也需要特定…

【英语】2. 英语的表达习惯

文章目录 前言less v. more n.解释e.g. less v. more prep.被动与中文的歧义总结参考文献 前言 进行英语前后缀的复习 less v. more n. 解释 外国的表达方式:更多地偏向静态,因此更多地使用名词 e.g. (rather Chinglish expression) She could not c…

Linux Cent7 已安装MySQL5.7.X,再安装MYSQL8.4.2

一、 下载安装 检查Linux系统的glibc版本rpm -qa | grep glibc结果:glibc-common-2.17-260.el7_6.6.x86_64 glibc-2.17-260.el7_6.6.x86_64 glibc-headers-2.17-260.el7_6.6.x86_64 glibc-devel-2.17-260.el7_6.6.x86_64访问MySQL官网,下载对应版本数据…

【智能算法应用】侏儒猫鼬优化算法求解二维路径规划问题

摘要 在复杂环境下的移动机器人路径规划问题中,最优路径的求解具有重要的应用价值。本文基于一种新型智能优化算法——侏儒猫鼬优化算法(DMOA),提出了一种二维路径规划的有效求解方法。该算法通过模拟侏儒猫鼬的觅食、社会合作与…

一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码

手头有 109 张头部 CT 的断层扫描图片,我打算用这些图片尝试头部的三维重建。基础工作之一,就是要把这些图片数据读出来,组织成一个三维的数据结构(实际上是四维的,因为每个像素有 RGBA 四个通道)。 这个…

Github优质项目推荐-第四期

文章目录 Github优质项目推荐 - 第四期一、【Umi-OCR】,26.1k stars - 文字识别工具二、【AFFiNE】,41k stars - 知识库平台三、【NocoBase】,12k stars - 无代码/低代码平台四、【neovim】,82.3k stars - 改良版VIM五、【generat…

LLM大模型:开源RAG框架汇总

前言 本文搜集了一些开源的基于LLM的RAG(Retrieval-Augmented Generation)框架,旨在吸纳业界最新的RAG应用方法与思路。如有错误或者意见可以提出,同时也欢迎大家把自己常用而这里未列出的框架贡献出来,感谢~ RAG应用…

【AI副业项目】AI猫咪带娃新风尚:探索副业新机遇

随着互联网技术的飞速发展,内容创作已成为许多人追求自我表达、实现职业转型或发展副业的重要途径。然而,在信息爆炸的时代,如何创作出既新颖又吸引眼球的内容,成为了摆在每位创作者面前的难题。 在当今这个数字化与智能化并行的…