您的位置:首页 > 编程语言 > MATLAB

各向异性扩散实现多晶硅电池片裂纹检测——matlab

2018-03-28 16:54 411 查看
clear;
close all;
clc;
[filename,filepath] = uigetfile('*.*','Select the image','E:\学习资料\MATLAB程序\裂纹分割\2_8.jpg'); %创建标准的对话框并通过交互式操作取得文件名
if isequal(filename,0)||isequal(filepath,0)%判断若干个给定的数组容量(contents)是否是相等的
return;
else
filefullpath=[filepath,filename];
end
%得到文件名,以便建立一个文件夹保存分块图像
[pathstr,name,ext] = fileparts(filename);%该函数用于将一个文件的完整路径中各部分提取出来,pathstr是这个文件的路径名,name是文件名,ext是包含一个点号文件的扩展名(指定了文件的类型)。
tic
Im=imread(filefullpath);
B=size(size(Im));
if B(2)==3
Im=rgb2gray(Im);
end
figure,imshow(Im);
diff_im=Im;
num_iter =3;
delta_t = 1/4;
kappa =4;
dx = 1;
dy = 1;
dd = sqrt(2);
%这是4个方向
hN = [0 1 0; 0 -1 0; 0 0 0];
hS = [0 0 0; 0 -1 0; 0 1 0];
hE = [0 0 0; 0 -1 1; 0 0 0];
hW = [0 0 0; 1 -1 0; 0 0 0];
%非正方向
% hNE = [0 0 1; 0 -1 0; 0 0 0];
% hSE = [0 0 0; 0 -1 0; 0 0 1];
% hSW = [0 0 0; 0 -1 0; 1 0 0];
% hNW = [1 0 0; 0 -1 0; 0 0 0];
f=diff_im/255;
% Anisotropic diffusion.
for t = 1:num_iter
nablaN = imfilter(diff_im,hN,'conv');
nablaS = imfilter(diff_im,hS,'conv');
nablaW = imfilter(diff_im,hW,'conv');
nablaE = imfilter(diff_im,hE,'conv');
%         nablaNE = imfilter(diff_im,hNE,'conv');
%         nablaSE = imfilter(diff_im,hSE,'conv');
%         nablaSW = imfilter(diff_im,hSW,'conv');
%         nablaNW = imfilter(diff_im,hNW,'conv');
cN = 1./(1 + f.*(kappa./nablaN).^2);
cS = 1./(1 + f.*(kappa./nablaS).^2);
cW = 1./(1 + f.*(kappa./nablaW).^2);
cE = 1./(1 + f.*(kappa./nablaE).^2);
%             cNE = 1./(1 + f.*(kappa./nablaN).^2);
%             cSE = 1./(1 +f.*(kappa./nablaN).^2);
%             cSW = 1./(1 +f.*(kappa./nablaN).^2);
%             cNW = 1./(1 + f.*(kappa./nablaN).^2);
%         diff_im = diff_im + ...
%                   delta_t*(...
%                   (1/(dy^2))*cN.*nablaN + (1/(dy^2))*cS.*nablaS + ...
%                   (1/(dx^2))*cW.*nablaW + (1/(dx^2))*cE.*nablaE + ...
%                   (1/(dd^2))*cNE.*nablaNE + (1/(dd^2))*cSE.*nablaSE + ...
%                   (1/(dd^2))*cSW.*nablaSW + (1/(dd^2))*cNW.*nablaNW );
diff_im = diff_im + ...
delta_t*(...
cN.*nablaN + cS.*nablaS + ...
cW.*nablaW + cE.*nablaE );
fprintf('\rIteration %d\n',t);
end
I=abs(diff_im-Im);
figure,imshow(I,[]);

mean_I=mean(mean(I));
std_I=std2(I);
C=1.2;
threshold=mean_I+C*std_I;

% threshold=5;
A=size(I);
for i=1:A(1)
for j=1:A(2)
if I(i,j)<threshold
I(i,j)=255;
else
I(i,j)=0;
end
end
end
figure;
imshow(I);

[m,n]=size(I);
B=I;
c=zeros(m,n);
for x=2:m-1
for y=2:n-1
if (B(x-1,y)+B(x,y)+B(x+1,y)==0 || B(x,y-1)+B(x,y)+B(x,y+1)==0 || B(x-1,y-1)+B(x,y)+B(x+1,y+1)==0 || B(x-1,y+1)+B(x,y)+B(x+1,y-1)==0)
c(x,y)=0;
else
c(x,y)=255;
end
end
end
figure,imshow(c);
%%%%显示为红色的区域
I_color = Im;
I_color1 = I_color;
I_color2 = I_color;
I_color3 = I_color;

[rows,cols] = find(c==0);
for i =1:size(rows)
%     I_red(rows(i),cols(i)) = [255,0,0];
%     I_color(rows(i),cols(i)) = 255;
I_color1(rows(i),cols(i)) = 255;
I_color2(rows(i),cols(i)) = 0;
I_color3(rows(i),cols(i)) = 0;
end
I_red(:,:,1) = I_color1;
I_red(:,:,2) = I_color2;
I_red(:,:,3) = I_color3;
figure,imshow(I_red(23:m-23,23:n-23,:));
d=c;
for i1=-1:1
for j1=-1:1
for x=2:m-1
for y=2:n-1
if( d(x,y)==0 && B(x+i1,y+j1)==0)
d(x+i1,y+j1)=0;
end
end
end
end
end
figure;
imshow(d);
e=c-d;
figure;
imshow(e);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: