【问题标题】:How to identify gold color in image? [closed]如何识别图像中的金色? [关闭]
【发布时间】:2016-12-05 00:14:06
【问题描述】:

我有一个关于硬币识别的任务。我国的硬币有两种颜色:金色和银色。如何识别金色?

我已经设法从图像中裁剪出每枚硬币,它们由几枚硬币组成。我想知道如何识别金色硬币。

我的讲师建议:

  • 将 RGB 转换为 HSI
  • 获取裁剪后的硬币图像的色相和饱和度值
  • 如果它的色相和饱和度值在金色的色相范围内 饱和是一枚金币。

我的方法如下:

  1. 增强图像,使颜色可见。
  2. 识别每个硬币并裁剪它们
  3. 识别它们的颜色并将它们分成两组:银色和金色。
  4. 通过将每种颜色的一枚硬币作为参考,然后将另一枚硬币与参考硬币进行比较来识别它们的价值(基于比率)。

我已经完成了第 1 步和第 2 步,但我被困在了第三步。我不知道如何区分金色和银色硬币。在 MATLAB 中我应该使用哪种方法来区分它们?

【问题讨论】:

  • 嗯,你问这个问题的方式太广泛了,无法回答。相反,描述确切您遇到的问题。。我认为这是第一步。您对使用 matlab 将 RGB 转换为 HSI 图像数据进行了哪些研究?您对 google/stackoverflow 研究的哪些结果不了解?
  • 好的,马库斯。我正在使用matlab做硬币识别系统。这些是我国硬币的示例图片。我必须检查图片并计算图片中硬币的总价值。我的方法是 1.Enhance 图像,使颜色可见。 2.然后识别每个硬币并裁剪它们 3.然后识别它们的颜色并将它们分成两组颜色银色和金色。 4 然后通过用每种颜色制作一枚硬币来识别它们的价值
  • 这完全没有解释我上面问的问题:你到底卡在哪里了?这真的不是免费的代码编写服务,所以你必须压缩你的将问题归结为一个单一的、精确的问题,否则,我们无法为您提供帮助。
  • 因此,鉴于这张照片,我发现您的方法存在一些直接问题,即 5 和 20 件的颜色非常相似。如果你还是想这样做,我建议从这些硬币中拍摄一组照片,提取每枚硬币的平均颜色,然后使用类似 decision tree
  • 那么,嗯,是的,根据您告诉我们的信息,我们应该如何知道?真的,描述/显示/说明您正在查看的数据。说“我的工作是区分黄金和白银,但我不知道如何”并不能准确描述您正在查看的内容。

标签: image matlab image-processing colors computer-vision


【解决方案1】:

这里有一些东西可以使用。它仅针对此特定图像进行了调整,可能不适用于其他图像。

  1. 使用gamma = 1.5 执行伽马校正。之所以会这样,是因为我想把图片右侧较亮的金币调低强度,以匹配左侧图片的金币,这样更容易进行阈值分割。

  2. 使用色调和饱和度通道来区分金币。

  3. 使用形态学并填充阈值结果具有的任何孔

  4. 移除任何面积小于 12000 像素的质量。


步骤#1

您可以使用imadjustgamma = 1.5 执行伽玛调整,您只需执行以下操作。首先加载我将直接从 StackOverflow 执行的图像,然后进行 gamma 调整:

close all;
im = imread('http://i.stack.imgur.com/g4FCV.jpg');
im_enhance = imadjust(im, [], [], 1.5);

im 是原始图像,im_enhance 是增强图像。我们得到以下增强图像:

有点难看,但是如果你自己放大图片点击上图,你会发现图片右侧的金色比之前稍微暗了一点。

步骤 #2

首先使用rgb2hsv将您的图像转换为HSV:

hsv = rgb2hsv(im2double(im_enhance));

之后,我使用impixelinfo 并通过imshow(im_enhance) 打开上面的图像,并将鼠标悬停在金币上以查看色调和饱和度是什么。通过检查,我看到色调值大约为 0.25 或更低,饱和度值为 0.25 或更高,以区分金币和银币。因此,使用这些范围来设定阈值并获得一个二进制地图,告诉您什么属于金币,什么不属于:

gold_coins = hsv(:,:,1) < 0.25 & hsv(:,:,2) > 0.25;

我们现在得到这张图片:

不完美。我们可以看到,大块的白色属于金币,而上面有洞的则是银币。

步骤#3

我们接下来要做的是填充金色物体必须的任何孔,以确保您获得所有应该是金色的区域。使用 imfill'holes' 选项来执行此操作。

gold_coins_fill = imfill(gold_coins, 'holes');

我们现在得到:

很好,但我们又要处理银币了。金币完全没问题。

步骤#4

为了移除任何属于银币的质量,我移除了遮罩中所有小于 12000 像素的区域。这是通过反复试验完成的。您可以使用函数bwareaopen 并指定 12000 作为此图像的第二个参数来执行此操作:

gold_coins_final = bwareaopen(gold_coins_fill, 12000);

我们现在得到:


如果你只是想通过复制和粘贴来运行它,完整的代码如下所示:

% Step #1
close all;
im = imread('http://i.stack.imgur.com/g4FCV.jpg');
im_enhance = imadjust(im, [], [], 1.5);

% Step #2
hsv = rgb2hsv(im2double(im_enhance));   
gold_coins = hsv(:,:,1) < 0.25 & hsv(:,:,2) > 0.25;

% Step #3
gold_coins_fill = imfill(gold_coins, 'holes');

% Step #4
gold_coins_final = bwareaopen(gold_coins_fill, 12000);
imshow(gold_coins_final);

【讨论】:

  • 雷仁!非常感谢大佬!你的方法有效!我用大量图片进行了一些修改来测试。及其作品!非常感谢老兄..!
【解决方案2】:

使用 imagemagick 库:

Fuzz 运算符可让您将图像颜色与某种颜色进行比较。虽然它们不必完全相同,但具有您决定的相似因素。所以算法可以如下:

  1. 检测图像中的金色(模糊检测)
  2. 用黑色替换所有金色像素(可以是任何颜色)
  3. 计算新图像中的黑色像素
  4. 如果至少有 80% 的像素被计算出来,则为金币,否则不是金币:

将金色转换为黑色:

 convert img -fuzz 80%  -fill black -opaque gold  newImage

获取所有不同的颜色计数:

convert  newimage -define histogram:unique-colors=true \
        -format %c histogram:info:-

如果黑色计数高于 80% (+-),则为金币。

*一定要选择原图不能出现的替换色。

【讨论】:

  • 这不是 MATLAB 答案。
  • 因为这不是 MATLAB 语法。
  • 我希望那个操作员希望有一个她/他可以提交的 Matlab 解决方案。但是,这是一个关于 DSP 的网站,所以我不认为这个答案没有使用 Matlab 是最小的问题 - 它描述了一种 DSP 方法,甚至说明了它。一个明显有用且有价值的答案。
  • 所以我真的不明白为什么这会被否决。
  • @MarcusMüller StackOverflow 不是关于 DSP 的网站。 DSP的网址是:dsp.stackexchange.com
猜你喜欢
  • 1970-01-01
  • 2014-03-09
  • 2010-10-18
  • 2018-10-08
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多