阅读背景:

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

来源:互联网 
clear;
close all;
clc;
[filename,filepath] = uigetfile('*.*','Select the image','E:\学习资料\MATLAB程序\裂纹分割_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);
               
                
        
clear;
close all;
clc;
[filename,filepath] = ui



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: