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