各向异性扩散实现多晶硅电池片裂纹检测——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);
相关文章推荐
- 一点一滴完全突破KAZE特征检测算法,从各向异性扩散滤波开始(2)
- matlab各向异性扩散滤波
- 一点一滴完全突破KAZE特征检测算法,从各向异性扩散滤波开始(1)
- 运用改进的各向异性扩散技术对微裂纹进行检测
- 数字图像处理,基于PM和Catte模型各向异性扩散的C++实现
- 一点一滴完全突破KAZE特征检测算法,从各向异性扩散滤波开始(2)
- 一点一滴完全突破KAZE特征检测算法,从各向异性扩散滤波开始(3)
- matlab练习程序(各向异性扩散)
- 各向异性扩散PM模型原理与C++实现
- 一点一滴完全突破KAZE特征检测算法,从各向异性扩散滤波开始(1)
- 基于MATLAB的adaboost级联形式的人脸检测实现
- PCA检测人脸的简单示例_matlab实现
- Hough圆检测的matlab实现
- MATLAB实现五种边缘检测
- 图像进行Sobel算子、Hough变换检测圆的matlab实现
- 各项异性扩散滤波 -- OpenCV实现
- 基于Hough 变换的直线检测(Matlab实现)
- [图像]Canny检测的Matlab实现(含代码)
- 个向异性扩散的尺度空间和边缘检测