如何识别图像中的金色?

Thi*_*vid -2 matlab image colors image-processing computer-vision

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

我已经从由几个硬币组成的图像中裁剪了每个硬币。我想知道如何识别金币。

我的讲师建议:

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

我的方法如下:

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

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

硬币的照片

ray*_*ica 5

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

  1. 使用 执行伽马校正gamma = 1.5。原因是因为我想把图像右侧较亮的金币强度调低,以匹配左侧图像上的金币,以便更容易阈值和分割。

  2. 使用色调和饱和度通道来限制金币。

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

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


第1步

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

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

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

在此处输入图片说明

有点难以看清,但是如果您通过单击上面的图像自己放大图像,您会看到图像右侧的金色比以前稍暗。

第2步

首先使用rgb2hsv以下命令将您的图像转换为 HSV :

hsv = rgb2hsv(im2double(im_enhance));
Run Code Online (Sandbox Code Playgroud)

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

gold_coins = hsv(:,:,1) < 0.25 & hsv(:,:,2) > 0.25;
Run Code Online (Sandbox Code Playgroud)

我们现在得到这个图像:

在此处输入图片说明

不完美。我们可以看到,大块的白色是金币,而有孔的则是银币。

第 3 步

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

gold_coins_fill = imfill(gold_coins, 'holes');
Run Code Online (Sandbox Code Playgroud)

我们现在得到:

在此处输入图片说明

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

第四步

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

gold_coins_final = bwareaopen(gold_coins_fill, 12000);
Run Code Online (Sandbox Code Playgroud)

我们现在得到:

在此处输入图片说明


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

% 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);
Run Code Online (Sandbox Code Playgroud)