MATLAB图像处理学习(一)

一、最初想法

MATLAB图像处理学习(一)_第1张图片
炉石传说卡牌,左上角是水晶费用,左下角是攻击力,右下角是血量。在学习机器学习的过程中,想利用卡牌的数据进行一些训练学习。但在卡牌数据录入的过程中感觉到繁琐,恰好老师叫我学习图像处理,在初步看了几本书后,仿照书中的车牌识别代码,初步想识别左上角的费用。

二、大致思路

根据《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('蓝色分量');

MATLAB图像处理学习(一)_第2张图片
观察灰度直方图,或者也可以做如下代码

[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

在做了如下处理后,结果如图:MATLAB图像处理学习(一)_第3张图片
顺便把数字也扣下来了,可能是因为我的范围本来就包括数字。

  • 接下来是抄代码环节,进行边缘处理。时间问题留作下一篇写。

结语

由于本人今年刚土木跨考计算机,刚学习,代码质量还得跟大家学一学,如有错误请多多包涵。这图像处理本人也是刚接触不久,知识体系尚未完全构建,有错误也请各位指出,我一定改正并认真学习,多谢。

你可能感兴趣的:(matlab学习)