Thi*_*vid -2 matlab image colors image-processing computer-vision
我有一个关于硬币识别的作业。我国的硬币有两种颜色:金色和银色。我如何识别金色?
我已经从由几个硬币组成的图像中裁剪了每个硬币。我想知道如何识别金币。
我的讲师建议:
我的方法如下:
我已经完成了第 1 步和第 2 步,但我被困在了第三步。我不知道如何区分金色和银色硬币。我应该使用哪种方法在 MATLAB 中区分它们?
这里有一些事情可以处理。它仅针对此特定图像进行了调整,可能不适用于其他图像。
使用 执行伽马校正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);
Run Code Online (Sandbox Code Playgroud)
im是原始图像,im_enhance是增强图像。我们得到以下增强图像:
有点难以看清,但是如果您通过单击上面的图像自己放大图像,您会看到图像右侧的金色比以前稍暗。
首先使用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)
我们现在得到这个图像:
不完美。我们可以看到,大块的白色是金币,而有孔的则是银币。
我们接下来要做的是填充金色物体必须的任何孔,以确保您获得所有应该是金色的区域。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)