MATLAB 识别色块和数量

打印 上一主题 下一主题

主题 971|帖子 971|积分 2913


前言

提示:这里可以添加本文要记载的大概内容:
项目需要:

在 MATLAB 中进行色块识别通常涉及图像处理技能,包括图像读取、预处理、颜色空间转换、阈值分割和形态学操纵等步骤。以下是一个基本的示例代码,展示了如何识别图像中的特定色块。
假设你有一张包罗多种颜色的图像,并且你想识别出特定颜色的色块(比方赤色)。
步骤 1: 读取图像

  1. % 读取图像
  2. img = imread('your_image.jpg');
复制代码
步骤 2: 转换为 HSV 颜色空间

HSV 颜色空间更适合颜色分割,由于它将颜色信息(色调、饱和度、亮度)分开。
  1. % 将图像从 RGB 转换为 HSV 颜色空间
  2. hsvImg = rgb2hsv(img);
复制代码
步骤 3: 界说颜色范围

在 HSV 空间中界说你要识别的颜色的范围。比方,赤色大概界说为:
  1. % 定义红色的 HSV 范围
  2. redHueRange = [0, 0.1];  % 色调范围
  3. redSaturationRange = [0.5, 1];  % 饱和度范围
  4. redValueRange = [0.5, 1];  % 亮度范围
复制代码
步骤 4: 创建颜色掩码

利用逻辑掩码来标识图像中的赤色区域。
  1. % 创建颜色掩码
  2. hueMask = (hsvImg(:,:,1) >= redHueRange(1)) & (hsvImg(:,:,1) <= redHueRange(2));
  3. saturationMask = (hsvImg(:,:,2) >= redSaturationRange(1)) & (hsvImg(:,:,2) <= redSaturationRange(2));
  4. valueMask = (hsvImg(:,:,3) >= redValueRange(1)) & (hsvImg(:,:,3) <= redValueRange(2));
  5. colorMask = hueMask & saturationMask & valueMask;
复制代码
步骤 5: 应用形态学操纵(可选)

为了去除噪声和小的孤立区域,可以利用形态学操纵,如膨胀和腐蚀。
  1. % 形态学操作
  2. se = strel('disk', 5);  % 创建一个结构元素
  3. cleanedMask = imopen(colorMask, se);  % 开运算去除小区域
  4. cleanedMask = imclose(cleanedMask, se);  % 闭运算填充小孔
复制代码
步骤 6: 标记和显示结果

利用 bwlabel 标记连通区域,并显示结果。
  1. % 标记连通区域
  2. [labeledImage, numRegions] = bwlabel(cleanedMask);
  3. % 显示结果
  4. figure;
  5. subplot(1, 3, 1);
  6. imshow(img);
  7. title('原始图像');
  8. subplot(1, 3, 2);
  9. imshow(colorMask);
  10. title('颜色掩码');
  11. subplot(1, 3, 3);
  12. imshow(label2rgb(labeledImage, 'jet', 'k', 'shuffle'));
  13. title(['识别到的色块数量: ', num2str(numRegions)]);
复制代码
完整代码

  1. % 读取图像
  2. img = imread('your_image.jpg');
  3. % 将图像从 RGB 转换为 HSV 颜色空间
  4. hsvImg = rgb2hsv(img);
  5. % 定义红色的 HSV 范围
  6. redHueRange = [0, 0.1];  % 色调范围
  7. redSaturationRange = [0.5, 1];  % 饱和度范围
  8. redValueRange = [0.5, 1];  % 亮度范围
  9. % 创建颜色掩码
  10. hueMask = (hsvImg(:,:,1) >= redHueRange(1)) & (hsvImg(:,:,1) <= redHueRange(2));
  11. saturationMask = (hsvImg(:,:,2) >= redSaturationRange(1)) & (hsvImg(:,:,2) <= redSaturationRange(2));
  12. valueMask = (hsvImg(:,:,3) >= redValueRange(1)) & (hsvImg(:,:,3) <= redValueRange(2));
  13. colorMask = hueMask & saturationMask & valueMask;
  14. % 形态学操作
  15. se = strel('disk', 5);  % 创建一个结构元素
  16. cleanedMask = imopen(colorMask, se);  % 开运算去除小区域
  17. cleanedMask = imclose(cleanedMask, se);  % 闭运算填充小孔
  18. % 标记连通区域
  19. [labeledImage, numRegions] = bwlabel(cleanedMask);
  20. % 显示结果
  21. figure;
  22. subplot(1, 3, 1);
  23. imshow(img);
  24. title('原始图像');
  25. subplot(1, 3, 2);
  26. imshow(colorMask);
  27. title('颜色掩码');
  28. subplot(1, 3, 3);
  29. imshow(label2rgb(labeledImage, 'jet', 'k', 'shuffle'));
  30. title(['识别到的色块数量: ', num2str(numRegions)]);
复制代码
这段代码提供了一个基本的框架,你可以根据具体需求调整颜色范围、形态学操纵和布局元素的大小等参数。

步骤七 返回色块坐标

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

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

学习使人快乐!
音乐使人愉悦!
日积月累使人充实和自大!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表