MATLAB 识别色块和数量

文章目录

  • 前言
      • [步骤 1: 读取图像](#步骤 1: 读取图像)
      • [步骤 2: 转换为 HSV 颜色空间](#步骤 2: 转换为 HSV 颜色空间)
      • [步骤 3: 定义颜色范围](#步骤 3: 定义颜色范围)
      • [步骤 4: 创建颜色掩码](#步骤 4: 创建颜色掩码)
      • [步骤 5: 应用形态学操作(可选)](#步骤 5: 应用形态学操作(可选))
      • [步骤 6: 标记和显示结果](#步骤 6: 标记和显示结果)
      • 完整代码
      • [步骤七 返回色块坐标](#步骤七 返回色块坐标)
  • 总结

前言

提示:这里可以添加本文要记录的大概内容:

项目需要:


在 MATLAB 中进行色块识别通常涉及图像处理技术,包括图像读取、预处理、颜色空间转换、阈值分割和形态学操作等步骤。以下是一个基本的示例代码,展示了如何识别图像中的特定色块。

假设你有一张包含多种颜色的图像,并且你想识别出特定颜色的色块(例如红色)。

步骤 1: 读取图像

matlab 复制代码
% 读取图像
img = imread('your_image.jpg');

步骤 2: 转换为 HSV 颜色空间

HSV 颜色空间更适合颜色分割,因为它将颜色信息(色调、饱和度、亮度)分开。

matlab 复制代码
% 将图像从 RGB 转换为 HSV 颜色空间
hsvImg = rgb2hsv(img);

步骤 3: 定义颜色范围

在 HSV 空间中定义你要识别的颜色的范围。例如,红色可能定义为:

matlab 复制代码
% 定义红色的 HSV 范围
redHueRange = [0, 0.1];  % 色调范围
redSaturationRange = [0.5, 1];  % 饱和度范围
redValueRange = [0.5, 1];  % 亮度范围

步骤 4: 创建颜色掩码

使用逻辑掩码来标识图像中的红色区域。

matlab 复制代码
% 创建颜色掩码
hueMask = (hsvImg(:,:,1) >= redHueRange(1)) & (hsvImg(:,:,1) <= redHueRange(2));
saturationMask = (hsvImg(:,:,2) >= redSaturationRange(1)) & (hsvImg(:,:,2) <= redSaturationRange(2));
valueMask = (hsvImg(:,:,3) >= redValueRange(1)) & (hsvImg(:,:,3) <= redValueRange(2));

colorMask = hueMask & saturationMask & valueMask;

步骤 5: 应用形态学操作(可选)

为了去除噪声和小的孤立区域,可以使用形态学操作,如膨胀和腐蚀。

matlab 复制代码
% 形态学操作
se = strel('disk', 5);  % 创建一个结构元素
cleanedMask = imopen(colorMask, se);  % 开运算去除小区域
cleanedMask = imclose(cleanedMask, se);  % 闭运算填充小孔

步骤 6: 标记和显示结果

使用 bwlabel 标记连通区域,并显示结果。

matlab 复制代码
% 标记连通区域
[labeledImage, numRegions] = bwlabel(cleanedMask);

% 显示结果
figure;
subplot(1, 3, 1);
imshow(img);
title('原始图像');

subplot(1, 3, 2);
imshow(colorMask);
title('颜色掩码');

subplot(1, 3, 3);
imshow(label2rgb(labeledImage, 'jet', 'k', 'shuffle'));
title(['识别到的色块数量: ', num2str(numRegions)]);

完整代码

matlab 复制代码
% 读取图像
img = imread('your_image.jpg');

% 将图像从 RGB 转换为 HSV 颜色空间
hsvImg = rgb2hsv(img);

% 定义红色的 HSV 范围
redHueRange = [0, 0.1];  % 色调范围
redSaturationRange = [0.5, 1];  % 饱和度范围
redValueRange = [0.5, 1];  % 亮度范围

% 创建颜色掩码
hueMask = (hsvImg(:,:,1) >= redHueRange(1)) & (hsvImg(:,:,1) <= redHueRange(2));
saturationMask = (hsvImg(:,:,2) >= redSaturationRange(1)) & (hsvImg(:,:,2) <= redSaturationRange(2));
valueMask = (hsvImg(:,:,3) >= redValueRange(1)) & (hsvImg(:,:,3) <= redValueRange(2));

colorMask = hueMask & saturationMask & valueMask;

% 形态学操作
se = strel('disk', 5);  % 创建一个结构元素
cleanedMask = imopen(colorMask, se);  % 开运算去除小区域
cleanedMask = imclose(cleanedMask, se);  % 闭运算填充小孔

% 标记连通区域
[labeledImage, numRegions] = bwlabel(cleanedMask);

% 显示结果
figure;
subplot(1, 3, 1);
imshow(img);
title('原始图像');

subplot(1, 3, 2);
imshow(colorMask);
title('颜色掩码');

subplot(1, 3, 3);
imshow(label2rgb(labeledImage, 'jet', 'k', 'shuffle'));
title(['识别到的色块数量: ', num2str(numRegions)]);

这段代码提供了一个基本的框架,你可以根据具体需求调整颜色范围、形态学操作和结构元素的大小等参数。

步骤七 返回色块坐标

c 复制代码
% 使用 regionprops 计算每个连通区域的属性
stats = regionprops(labeledImage, 'BoundingBox');
 
% 提取边界框坐标
boundingBoxes = [stats.BoundingBox];
 
% 显示结果,包括边界框
figure;
imshow(img);
hold on;
for k = 1:size(boundingBoxes, 1)
    rectangle('Position', boundingBoxes(k, :), 'EdgeColor', 'r', 'LineWidth', 2);
    % 如果需要,可以在这里打印或存储坐标
    fprintf('色块 %d 的坐标: [%f, %f, %f, %f]\n', k, boundingBoxes(k, 1), boundingBoxes(k, 2), boundingBoxes(k, 3), boundingBoxes(k, 4));
end
hold off;
title('识别到的色块及其边界框');

色块 1 的坐标: [160.500000, 156.500000, 44.000000, 43.000000]

总结

学习使人快乐!

音乐使人愉悦!

日积月累使人充实和自信!

相关推荐
运维行者_2 分钟前
通过OpManager的Windows服务监控能力释放最佳IT网络性能
服务器·开发语言·网络·windows·web安全·php
.千余4 分钟前
【Linux】进程概念
linux·服务器·开发语言·学习
码界筑梦坊18 分钟前
94-基于Python的商品物流数据可视化分析系统
开发语言·python·mysql·信息可视化·数据分析·毕业设计·fastapi
我爱C编程36 分钟前
移动边缘网络中基于双深度QLearning强化学习(DDQL)的高能效资源分配方法
matlab·强化学习·移动边缘网络·双深度qlearning·ddql·高能效资源分配
im_AMBER1 小时前
Leetcode 160 最小覆盖子串 | 串联所有单词的子串
开发语言·javascript·数据结构·算法·leetcode
Rabitebla1 小时前
【数据结构】动态顺序表实现详解:从原理到接口设计(面试视角)
c语言·开发语言·数据结构·c++·面试·职场和发展
郝学胜-神的一滴1 小时前
Linux 高并发基石:epoll 核心原理 + LT/ET 触发模式深度剖析
linux·运维·服务器·开发语言·c++·网络协议
A_aspectJ1 小时前
Java开发的学习优势:稳定基石与多元可能并存的技术赛道
java·开发语言
qq_283720051 小时前
Python 模块精讲:collections —— 高级数据结构深度解析(defaultdict、Counter、deque)
java·开发语言
wjs20242 小时前
Chart.js 饼图指南
开发语言