source: trunk/src/transform_field/ima_edge_detection.m @ 918

Last change on this file since 918 was 917, checked in by sommeria, 10 years ago

series modified to deal with NbSlice? in local mode, subbackground fixed, edge detection introduced

File size: 3.8 KB
Line 
1% 'ima_edge_detection': find edges
2
3%------------------------------------------------------------------------
4%%%%  Use the general syntax for transform fields with a single input and parameters %%%%
5% OUTPUT:
6% DataOut:   output field structure
7%
8%INPUT:
9% DataIn:  input field structure
10% Param: matlab structure whose field Param.TransformInput contains the filter parameters
11%-----------------------------------
12
13%=======================================================================
14% Copyright 2008-2015, LEGI UMR 5519 / CNRS UJF G-INP, Grenoble, France
15%   http://www.legi.grenoble-inp.fr
16%   Joel.Sommeria - Joel.Sommeria (A) legi.cnrs.fr
17%
18%     This file is part of the toolbox UVMAT.
19%
20%     UVMAT is free software; you can redistribute it and/or modify
21%     it under the terms of the GNU General Public License as published
22%     by the Free Software Foundation; either version 2 of the license,
23%     or (at your option) any later version.
24%
25%     UVMAT is distributed in the hope that it will be useful,
26%     but WITHOUT ANY WARRANTY; without even the implied warranty of
27%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
28%     GNU General Public License (see LICENSE.txt) for more details.
29%=======================================================================
30
31function DataOut=ima_edge_detection(DataIn,Param)
32
33%% request input parameters
34if isfield(DataIn,'Action') && isfield(DataIn.Action,'RUN') && isequal(DataIn.Action.RUN,0)
35    prompt = {'npx';'npy';'threshold'};
36    dlg_title = 'get the filter size in x and y';
37    num_lines= 3;
38    def     = { '50';'50';'0.3'};
39    if isfield(Param,'TransformInput')&&isfield(Param.TransformInput,'FilterBoxSize_x')&&...
40            isfield(Param.TransformInput,'FilterBoxSize_y')&&isfield(Param.TransformInput,'LumThreshold')
41        def={num2str(Param.TransformInput.FilterBoxSize_x);num2str(Param.TransformInput.FilterBoxSize_y);num2str(Param.TransformInput.LumThreshold)};
42    end
43    answer = inputdlg(prompt,dlg_title,num_lines,def);
44    DataOut.TransformInput.FilterBoxSize_x=str2num(answer{1}); %size of the filtering window
45    DataOut.TransformInput.FilterBoxSize_y=str2num(answer{2}); %size of the filtering window
46    DataOut.TransformInput.LumThreshold=str2num(answer{3}); %size of the filtering window
47    return
48end
49
50DataOut=DataIn; %default
51%DataOut.A=255*edge(DataIn.A);
52
53%definition of the cos shape matrix filter
54ix=[1/2-Param.TransformInput.FilterBoxSize_x/2:-1/2+Param.TransformInput.FilterBoxSize_x/2];%
55iy=[1/2-Param.TransformInput.FilterBoxSize_y/2:-1/2+Param.TransformInput.FilterBoxSize_y/2];%
56%del=np/3;
57%fct=exp(-(ix/del).^2);
58fct2_x=cos(ix/((Param.TransformInput.FilterBoxSize_x-1)/2)*pi/2);
59fct2_y=cos(iy/((Param.TransformInput.FilterBoxSize_y-1)/2)*pi/2);
60%Mfiltre=(ones(5,5)/5^2);
61Mfiltre=fct2_y'*fct2_x;
62Mfiltre=Mfiltre/(sum(sum(Mfiltre)));%normalize filter
63
64
65
66    Afilt=filter2(Mfiltre,DataIn.A(100:end-100,100:end-100));% smooth the image, excluding the edges (spurious reflexions)
67    Amax=max(max(Afilt));
68    Amin=min(min(Afilt));
69    Athreshold=(Amin+Amax)*Param.TransformInput.LumThreshold;
70%     
71%     DataOut.A=zeros(size(DataIn.A,1),size(DataIn.A,2),3);
72    DataOut.A=(DataIn.A>Athreshold);%transform to the initial image format
73%     DataOut.A(:,:,1)=DataIn.A;%transform to the initial image format, red
74STATS = regionprops(DataOut.A, 'FilledArea','MinorAxisLength','MajorAxisLength','PixelIdxList');
75Area=zeros(size(STATS));
76for iobj=1:numel(STATS)
77    Area(iobj)=STATS(iobj).FilledArea;
78end
79[Area, main_obj]=max(Area);
80    MajorAxisLength=STATS(main_obj).MajorAxisLength
81    MinorAxisLength=STATS(main_obj).MinorAxisLength
82for iobj=1:numel(STATS)
83    if iobj~=main_obj
84    DataOut.A(STATS(iobj).PixelIdxList)=0;
85    end
86end
87
88DataOut.A=Amax*DataOut.A;
89 
Note: See TracBrowser for help on using the repository browser.