如何识别图像中的金色?

时间:2016-07-30 10:48:13

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

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

我管理裁剪每个硬币的图像由几个硬币组成。我想知道如何识别金色币。

我的讲师建议:

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

我的方法如下:

  1. 增强图像,使颜色可见。
  2. 识别每枚硬币并裁剪它们
  3. 识别它们的颜色并将它们分成两组:银色和金色。
  4. 通过将每种颜色的一枚硬币作为参考来确定它们的价值,然后将其与另一枚硬币与参考硬币(基于比率)进行比较。
  5. 我已经完成了第1步和第2步,但我陷入了第三步。我不知道如何区分金色和银色硬币。我应该使用哪种方法在MATLAB中区分它们?

    photo of coins

2 个答案:

答案 0 :(得分:4)

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

  1. 使用gamma = 1.5执行伽玛校正。原因是因为我希望将图像右侧更亮的金币强度降低到与左图像上的金币相匹配,以便更容易进行阈值和分割。

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

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

  4. 删除面积小于12000像素的所有质量。

  5. 第1步

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

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

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

    enter image description here

    有点难以看到,但如果您通过点击上面的图像自己放大图像,您会发现图像右侧的金色比以前略深。

    步骤#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;
    

    我们现在得到这张图片:

    enter image description here

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

    步骤#3

    我们接下来要做的是填写金色物体必须具有的任何孔,以确保您获得所有应该是黄金的区域。使用imfill'holes'选项即可。

    gold_coins_fill = imfill(gold_coins, 'holes');
    

    我们现在得到:

    enter image description here

    太棒了,但我们还有银币要处理。金币非常好。

    步骤#4

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

    gold_coins_final = bwareaopen(gold_coins_fill, 12000);
    

    我们现在得到:

    enter image description here

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

    % 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);
    

答案 1 :(得分:-1)

使用imagemagick库:

Fuzz操作符可让您将图像颜色与特定颜色进行比较。虽然他们不必完全相同,但你决定使用相似因素。所以算法如下:

  1. 检测图像中的金色(模糊检测)
  2. 将所有黄金像素替换为黑色(可以是任何颜色)
  3. 计算新图像中的黑色像素
  4. 如果至少有80%的像素被计算在内,那就是金币,否则它不是金币:
  5. 将金色转换为黑色:

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

    获得所有不同的颜色:

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

    如果黑色计数超过80%(+ - ),那么它就是金币。

    *请务必选择原始图像中不能包含的替换颜色。