炉石传说卡牌,左上角是水晶费用,左下角是攻击力,右下角是血量。在学习机器学习的过程中,想利用卡牌的数据进行一些训练学习。但在卡牌数据录入的过程中感觉到繁琐,恰好老师叫我学习图像处理,在初步看了几本书后,仿照书中的车牌识别代码,初步想识别左上角的费用。
根据《MATLAB图像处理超级学习手册》这本书,根据我的个人理解,大致过程如下:
1.定位到目标区域;
2.根据第一步所得的目标区域对原图进行分割;
3.对分割的图像进行识别;
以下就这三个步骤进行我的代码展示说明。
因为目前感兴趣的只是水晶,首先就水晶的灰度组成要知道,因此使用Photoshop将目标直接抠图下来分析。
根据书中的知识点,图片由红、绿、蓝三种分量组成,在matlab中表现为三维的矩阵,
[I2,map]=imread(filename);%读取文件
image2=I2;
[m,n,d]=size(image2);
figure(3),
subplot(2,2,1)
imshow(image2);
%颜色分布
figure(3),
subplot(2, 2, 2),
imhist(image2(:,:,1)),
title('红色分量');
figure(3),
subplot(2, 2, 3),
imhist(image2(:,:,2)),
title('绿色分量');
figure(3),
subplot(2, 2, 4),
imhist(image2(:,:,3)),
title('蓝色分量');
[reg_y,reg_x]=imhist(image2(:,:,1));%imhist函数还会返回y轴频次和x轴灰度
[green_y,green_x]=imhist(image2(:,:,2));
[blue_y,blue_x]=imhist(image2(:,:,3));
这里灰度范围的选择不是绝对的,后面还要回来多次尝试范围。
在确定好范围之后,通过一个“过滤”的程序把原图中的水晶元素显示,
代码如下:
[I,map]=imread(filename);%测试的图是索引图,先转换成RGB的图像
image1=ind2rgb(I, map);
image_copy=image1;%先做一个复制
[m,n,d]=size(image1);%读取图片矩阵的大小,维度,方便遍历
for i = 1:m
for j = 1:n
if (image1(i,j,1)>0.168&&image1(i,j,1)<0.223)
%image_copy(i,j,1)=image1(i,j,1);%这是另外一个处理方式,直接保留原图,但是最后效果不明显,遂作罢
image_copy(i,j,1)=0;%变黑处理
else
image_copy(i,j,1)=1;
end
if (image1(i,j,2)>0.196&&image1(i,j,2)<0.424)
%image_copy(i,j,2)=image1(i,j,2);
image_copy(i,j,2)=0;
else
image_copy(i,j,2)=1;
end
if (image1(i,j,3)>0.278&&image1(i,j,3)<0.836)
%image_copy(i,j,3)=image1(i,j,3);
image_copy(i,j,3)=0;
else
image_copy(i,j,3)=1;
end
%蓝色尾处理
if (image1(i,j,3)>0.86)%这是调试之后发现面积太小,增加的代码 ,也可不作这种处理
image_copy(i,j,1)=0;
image_copy(i,j,2)=0;
image_copy(i,j,3)=0;
end
%绿色尾处理
if (image1(i,j,2)>0.7&&image1(i,j,2)<0.96)
image_copy(i,j,2)=0;
end
end
end
在经过上述筛选后,目标图像的颜色会变黑,为了更直接,将没有变黑的其他像素统一消除,变成白色。
%二次处理
for u = 1:m
for v = 1:n
if image_copy(u,v,1)~=0
image_copy(u,v,1)=1;
image_copy(u,v,2)=1;
image_copy(u,v,3)=1;
end
if image_copy(u,v,2)~=0
image_copy(u,v,1)=1;
image_copy(u,v,2)=1;
image_copy(u,v,3)=1;
end
if image_copy(u,v,3)~=0
image_copy(u,v,1)=1;
image_copy(u,v,2)=1;
image_copy(u,v,3)=1;
end
end
end
在做了如下处理后,结果如图:
顺便把数字也扣下来了,可能是因为我的范围本来就包括数字。
由于本人今年刚土木跨考计算机,刚学习,代码质量还得跟大家学一学,如有错误请多多包涵。这图像处理本人也是刚接触不久,知识体系尚未完全构建,有错误也请各位指出,我一定改正并认真学习,多谢。