一、最初想法
炉石传说卡牌,左上角是水晶费用,左下角是攻击力,右下角是血量。在学习机器学习的过程中,想利用卡牌的数据进行一些训练学习。但在卡牌数据录入的过程中感觉到繁琐,恰好老师叫我学习图像处理,在初步看了几本书后,仿照书中的车牌识别代码,初步想识别左上角的费用。根据《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进行以下处理后,结果如图所示:
顺便说一句,数字也被扣除了,可能是因为我的范围已经包含数字了。
结论
因为我今年刚刚在土木工程中进行了交叉测试,所以我刚刚学习了,因此我必须从所有人那里学习代码质量。如果有任何错误,请多多包涵。我刚刚接触过这种图像处理,并且知识系统尚未完全构建。请指出任何错误。我一定会纠正它们并仔细研究。谢谢。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shumachanpin/article-346492-1.html
0
鼓励那些国家和中国对着干