2016-07-30 185 views
-2

我有一个关于硬币识别的作业。我国的硬币由两种颜色组成:黄金和白银。我如何识别金色?如何识别图像中的金色?

我已经管理从图像中的每个硬币作物由几枚硬币组成。我想知道如何识别金色硬币。

我的讲师建议:

  • 转换RGB到HSI
  • 获取裁剪硬币图像的色调和饱和度值
  • 如果它是黄金的色调和 饱和度范围内的色调和饱和度值它是一枚金币。

我的做法是这样的:

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

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

photo of coins

+3

恩,你问这个问题的方式注意力过于宽泛,无法回答。相反,**描述你究竟遇到了什么问题。**。我认为这是第一步。你使用matlab将RGB转换为HSI图像数据的研究有哪些?你的谷歌/ stackoverflow研究的结果是什么你不明白? –

+0

好的马库斯。我正在用matlab做硬币识别系统。这些是我国硬币的示例图片。我必须检查图片并计算图片中硬币的总价值。我的方法是1.增强图像,使颜色可见。 2.确定每枚硬币并剪下它们3.然后确定它们的颜色,并将它们分成两组颜色银色和金色。 4然后通过从每种颜色的颜色 –

+2

中做出一个硬币来确定它们的价值,这些硬币对于我上面提出的问题没有任何解释:**您坚持到底在哪里?**这实际上没有免费代码编写服务,所以您有把你的问题简化成一个确切的问题,否则,我们无法帮助你。 –

回答

4

这里的一些工作。它只针对这个特定的图像进行调整,它可能不适用于其他图像。

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

im是原始图像和im_enhance是增强的图像。我们得到如下增强图像:

enter image description here

有一点很难看,但如果你通过点击上面的图片放大自己的形象,你会看到金色的颜色在图像的右侧比以前稍暗。

步骤#2

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

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

Rayreng!非常感谢Dude!你的方法有效!我测试了很多图片,并进行了一些修改。它的作品!非常感谢兄弟..! –

-1

使用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%以上(+ - ),那么它就是一个金币。

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

+1

这不是MATLAB的答案。 – Adriaan

+0

这是为什么?... –

+1

因为这不是一个长镜头的MATLAB语法。 – Adriaan