我有关于硬币识别的任务。我国的硬币由两种颜色组成:金色和银色。我如何识别金色?
我管理裁剪每个硬币的图像由几个硬币组成。我想知道如何识别金色币。
我的讲师建议:
我的方法如下:
答案 0 :(得分:4)
这里有一些可以使用的东西。它仅针对此特定图像进行了调整,并且可能无法用于其他图像。
使用gamma = 1.5
执行伽玛校正。原因是因为我希望将图像右侧更亮的金币强度降低到与左图像上的金币相匹配,以便更容易进行阈值和分割。
使用色调和饱和度通道来限制金币。
使用形态学并填写阈值结果具有的任何孔
删除面积小于12000像素的所有质量。
您可以使用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
是增强图片。我们得到以下增强图像:
有点难以看到,但如果您通过点击上面的图像自己放大图像,您会发现图像右侧的金色比以前略深。
首先使用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;
我们现在得到这张图片:
不完美。我们可以看到,大量的白色属于金币而有孔的则是银色。
我们接下来要做的是填写金色物体必须具有的任何孔,以确保您获得所有应该是黄金的区域。使用imfill
和'holes'
选项即可。
gold_coins_fill = imfill(gold_coins, 'holes');
我们现在得到:
太棒了,但我们还有银币要处理。金币非常好。
要移除任何属于银币的质量,我会移除面具中小于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);
答案 1 :(得分:-1)
使用imagemagick库:
Fuzz操作符可让您将图像颜色与特定颜色进行比较。虽然他们不必完全相同,但你决定使用相似因素。所以算法如下:
将金色转换为黑色:
convert img -fuzz 80% -fill black -opaque gold newImage
获得所有不同的颜色:
convert newimage -define histogram:unique-colors=true \
-format %c histogram:info:-
如果黑色计数超过80%(+ - ),那么它就是金币。
*请务必选择原始图像中不能包含的替换颜色。