⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 findfilter.m

📁 该文件是用matlab开发的图论分析工具箱
💻 M
字号:
function [imgGraph,newPoints,newEdges]=findfilter(points,extent,F,edges)%Function [imgGraph,newPoints,newEdges]=findfilter(points,extent,F,edges)%Generates an ImgGraph with the appropriate filters for an input 2D point %set and Delaunay triangles for edges.%%Inputs:    points - A Nx2 point set intended to represent the sampling of%                   visual space%           extent - Optional vector [a b] specifying the extent of the %                   points (i.e. set a/b to input an AxB image). Default %                   is to leave points as input                   %           F - Optional input specifying the scale of the ellipses%                   relative to the Voronoi cells (Default: 1)%           edges - Optional Mx2 edge set.  In input, the returned edge set%                   will be a subset of the input edges with edges %                   connecting removing points removed.  If not input, %                   the returned edge set will correspond to a %                   retriangulation of the points%%Outputs:   imgGraph - The imgGraph with appropriate filters for the%                   given point set%           newPoints - Nx2 set of non-removed points%           newEdges - Optional Mx2 set of non-removed edges%%References:%@MastersThesis{heckbert1989:fundamentals,%  author = 	 {Heckbert, Paul},%  title = 	     {Fundamentals of Texture Mapping and Image Warping},%  school = 	 {University of California at Berkeley},%  year = 	     {1989} }%%%Note: Assumes that the points are scattered about the origin%Note2: Based on script precursorFindFilt.m%%%5/20/02 - Leo Grady% Copyright (C) 2002, 2003 Leo Grady <lgrady@cns.bu.edu>%   Computer Vision and Computational Neuroscience Lab%   Department of Cognitive and Neural Systems%   Boston University%   Boston, MA  02215%% This program is free software; you can redistribute it and/or% modify it under the terms of the GNU General Public License% as published by the Free Software Foundation; either version 2% of the License, or (at your option) any later version.%% This program is distributed in the hope that it will be useful,% but WITHOUT ANY WARRANTY; without even the implied warranty of% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the% GNU General Public License for more details.%% You should have received a copy of the GNU General Public License% along with this program; if not, write to the Free Software% Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.%% Date - $Id: findfilter.m,v 1.3 2003/08/21 17:29:29 lgrady Exp $%========================================================================%%Check inputsif nargin < 4    F=1;endif nargin < 5    dispFlag=0;end    %InitializationEPSILON=1e-6;OFFSET=1.5;N=length(points);[pntMap,filtWeights,removalIndex,singleBoundPointIndex,vx,vy]=deal([]);[breakpoints,weightInd]=deal(1);%Find extremal nodesminX=min(points(1,:));maxX=max(points(1,:));minY=min(points(2,:));maxY=max(points(2,:));%Adjust extent, if requestedif nargin > 1    minX=-extent(1)/2;    maxX=extent(1)/2;    minY=-extent(2)/2;    maxY=extent(2)/2;            points=normalize(points,[minX,minY;maxX,maxY]);end%Add phantom border points for VoronoihalfN=ceil(N/2);widthBorder=linspace(minX-OFFSET,maxX+OFFSET,halfN)';widthBorder=widthBorder(2:(end-1)); %Don't duplicate cornersheightBorder=linspace(minY-OFFSET,maxY+OFFSET,halfN)';points=[points;[minX*ones(halfN,1)-OFFSET;maxX*ones(halfN,1)+OFFSET; ...            widthBorder;widthBorder],[heightBorder;heightBorder; ...            minY*ones(halfN-2,1)-OFFSET;maxY*ones(halfN-2,1)+OFFSET]];             %OFFSET used to give a small buffer around node cluster%Find voronoi cells[vpoints, vcells] = voronoin(points);%Find infinity pointinfPoints=find(vpoints(:,1)==Inf);%Find filtersfor k=1:N    if ~(sum(vcells{k}==infPoints))        %Fit ellipse to Voronoi cells with LSE        [coeffs, centroid]=ellipsefit(vpoints(vcells{k},:),F);        offset=abs(round(centroid)-centroid);                %Find bounding box        xBound=2*sqrt(-coeffs(3)*F/(coeffs(2)^2-4*coeffs(1)*coeffs(3)));        yBound=2*sqrt(-coeffs(1)*F/(coeffs(2)^2-4*coeffs(1)*coeffs(3)));        [xgrid,ygrid]=meshgrid(-ceil(xBound):ceil(xBound), ...            -ceil(yBound):ceil(yBound));        xgrid=xgrid+offset(1);        ygrid=ygrid+offset(2);                %Using Heckbert's notation, find bounded points        domainEllipse=coeffs(1)*(xgrid).^2 + ...            coeffs(2)*(xgrid).*(ygrid) ...            + coeffs(3)*(ygrid).^2;        boundedPts=find(domainEllipse<=F);        numbBoundPts=length(boundedPts);                %Add new points        if(isempty(boundedPts)) %Remove any nodes which bound zero pixels            removalIndex=[removalIndex,k];        else            %Assign pixels to array            newWeight=exp(-.5*(xgrid(boundedPts).^2 ...                + ygrid(boundedPts).^2));            realWeight=find(newWeight>EPSILON);                 %Prevent storage of values that have no effect            newWeight=newWeight(realWeight);            boundedPts=boundedPts(realWeight);            if isempty(newWeight) %If the filtWeights are all subthreshold               removalIndex=[removalIndex,k];            else                pntMap=[pntMap;[xgrid(boundedPts)+points(k,1),...                    ygrid(boundedPts)+points(k,2)]];                newWeight=newWeight./sum(newWeight);  %Sum to unity                filtWeights=[filtWeights;newWeight];                breakpoints(weightInd+1,:)=breakpoints(weightInd)+ ...                    length(realWeight);                weightInd=weightInd+1;            end        end    endend%PostprocesspntMap=floor(abs(pntMap)).*sign(pntMap);breakpoints=breakpoints(2:end); %Remove leading '1' value%Remove nodes that bound zero pixelsif(~isempty(removalIndex))    %Remove points from point list    keepPts=1:N;    keepPts(removalIndex)=[];    N2=N-length(removalIndex);else    N2=N;    keepPts=1:N;endnewPoints=points(keepPts,:);%Remove edges to removed nodesif (nargout > 2) & (nargin < 4)    [newEdges,faces]=triangulatepoints(newPoints);elseif (nargout > 2)    W=adjacency(edges);    newEdges=adjtoedges(W(keepPts,keepPts));end%Generate ImgGraphimgGraph.pntMap=pntMap;imgGraph.breakpoints=breakpoints;imgGraph.filtWeights=filtWeights;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -