用Matlab图像处理提取图片不一样的地方

前言
今天介绍下用Matlab来进行图像处理的一个东西,也是以前做的一个图像处理,也是我第一个图像处理的作业,已经有1年多的东西了,当时写代码不规范,忘了给代码注释了,这些是我最近注释的,很多都已经忘记了它的功能了,最近也没有玩图像处理,所以可能有不足之处,但是代码是可以运行的,希望能帮助到有需要的小伙伴哦。


clc;clear;
close all
src = imread('2.png');  %读取图像数据
figure(1),subplot(2,2,1),imshow(src),title('原图');  %建立图形1,建立2*2窗格,把图画在第一行第一列,展示src中的图,标题为“原图”
bw=rgb2gray(src); %把src图从RGB转为灰度图
bw=im2bw(src,0.56); %把src图从灰度图转为二值图,阈值设为0.56
subplot(2,2,2),imshow(bw),title('二值图像') %建立2*2窗格,把图画在第二行第二列,展示src中的图,标题为“二值图像”
se = strel('square',2);  %创建2*2的正方形
openbw=imopen(bw,se); %开运算先腐蚀后膨胀,作用是:可以使边界平滑,消除细小的尖刺,断开窄小的连接,保持面积大小不变
subplot(2,2,3),imshow(openbw),title('开运算后的效果图')
[L,num] = bwlabel(openbw,8);  %8连通标记,连通域
RGB = label2rgb(L);  %转换标记矩阵L到RGB图像
subplot(2,2,4),imshow(RGB),title('用rgb颜色标记不同区域')
stats = regionprops(openbw, 'BoundingBox' ,'Area','Centroid' ,'PixelList' );  %度量图像区域属性的函数:包含相应区域的最小矩形,图像各个区域中像素总个数,每个区域的质心(重心),存储上述索引对应的像素坐标
centroids = cat(1, stats.Centroid); %dim为1时,将矩阵上下拼接

noiseArea=100;
figure(2),imshow(openbw),title('2')  
for i=1:size(stats)
    rectangle('Position',[stats(i).BoundingBox],'LineWidth',2,'LineStyle','--','EdgeColor','r'),
    text(centroids(i,1),centroids(i,2),int2str(i),'color','red')  %画出每个瓦片红色的连通域框框
    area = stats(i).Area;  %连通区域的面积                                
end
for i=1:size(stats)
    [Li,num] = bwlabel(openbw,8);
    Li(Li~=i)=0;  %这边进行区域的选择,例如只保留2、3.      
    imwrite(Li,strcat('D:\good1\',[num2str(i),'.png'])); %每块连通域单独切开来,按1、2、3....编号写入文件中
end

for i=1:size(stats)
    ai=imread(strcat('D:\good\',[num2str(i),'.png']));  %读取正常的每块瓦片
    bi=imread(strcat('D:\good1\',[num2str(i),'.png']));  %读取非正常的每块瓦片
    ci=xor(ai,bi);  %异或
    imwrite(ci,strcat('D:\wrong\',[num2str(i),'.png']));  %把每块瓦片不一样的地方存进去,比如相同的全为黑色,不同的为白色
end

for i=1:size(stats)
di=imread(strcat('D:\wrong\',[num2str(i),'.png']));  %strcat:水平地连接成单个字符串变为D:\wrong\变量.png,再所有异或出的图片中读取有白色(即有问题的瓦片)
e=sum(di(:));  %矩阵求和
    if e==0
    else
    imwrite(di,strcat('D:\wrong1\',[num2str(i),'.png'])); %只提取出有问题的的瓦片及编号,存入另一个文件中
    end
end
用Matlab图像处理提取图片不一样的地方_第1张图片
二值图
用Matlab图像处理提取图片不一样的地方_第2张图片
标出连通域进行标号
用Matlab图像处理提取图片不一样的地方_第3张图片
标出连通域
用Matlab图像处理提取图片不一样的地方_第4张图片
正常的存在good文件夹,非正常的存在good1文件下
用Matlab图像处理提取图片不一样的地方_第5张图片
正常(下)和非正常(上)对比,写入到wrong1

这个是很久以前做的图像处理,已经有点忘了,所以大概看看吧,可能会有些不好,但是这个代码是可以运行的。
好了今天就介绍到这了,欢迎各位的关注和分享哦!!

你可能感兴趣的:(用Matlab图像处理提取图片不一样的地方)