www.gusucode.com > 声音的处理有:LPC,FFT,共振峰,频谱源码程序 > siganlandsystemusingMatlab/SSUM/spectrum/image/imgspectrumexpofn.m

    %
function imgspectrumexpofn(action,datastruct)
    if nargin < 1
        action='init';
    end

	name = mfilename;
    figname = [name(1:end-2) '_fig'];
    f=findobj('Tag',figname);
    handles = get(f,'UserData');

	% Make it so that you can grab just one line
	% handles.vert keeps changing when plotting pixel vals and spectrum

    switch action
		case 'help'
			display_help(figname);
        case 'init'
			setdefaults;
			reset(handles.spectrum);
			reset(handles.horizontal_spectrum);
			reset(handles.vertical_spectrum);
		case 'load'
			handles.imagedata = load_imagedata;
            if ~isfield(handles.imagedata, 'filenamepath')
                return;
            elseif isfield(handles,'figwin');
				try,
	                close(handles.figwin);
				catch
				end
			end
			
            handles.figwin = showimage(handles.imagedata, ...
				get(handles.scale,'Value'), get(handles.inverse,'Value'));
            movegui(handles.figwin,'onscreen');
            zoom(handles.figwin, 'off');
			place_header(handles.figwin, handles);
			handles = place_lines(handles.figwin, handles);
            make2DSpecPlot(handles);
            drawSpectra(handles);
            figure(handles.figwin);
		case 'readinput'
			handles.imagedata = datastruct;
            clear datastruct
            setdefaults;
            reset(handles.spectrum);
			reset(handles.horizontal_spectrum);
            reset(handles.vertical_spectrum);
            handles.figwin = showimage(handles.imagedata, ...
				get(handles.scale,'Value'), get(handles.inverse,'Value'));
            movegui(handles.figwin,'onscreen');
            zoom(handles.figwin, 'off');
			place_header(handles.figwin, handles);
			handles = place_lines(handles.figwin, handles);
            make2DSpecPlot(handles);
            drawSpectra(handles);
            figure(handles.figwin);
		case {'scale','inverse'}
			if isfield(handles, 'imagedata')
				figure(handles.figwin);
				X = get(gca, 'XLim');
				Y = get(gca, 'YLim');
				showimage(handles.imagedata, get(handles.scale,'Value'), get(handles.inverse,'Value'), handles.figwin);
				set(gca,'XLim',X,'YLim',Y);
				handles.h = line(get(gca,'Xlim'), [handles.vert handles.vert],...
					'Color','r','EraseMode','xor');
				handles.v = line([handles.hori handles.hori], get(gca,'YLim'),...
					'Color','r','EraseMode','xor');
				handles.p = plot(handles.hori, handles.vert,'ro','MarkerSize',10,...
					'ButtonDownFcn','imgspectrumexpofn point','EraseMode','xor');
			end
		case 'drawmenu'
			content = get(handles.drawmenu,'String');
			switch lower(content{get(handles.drawmenu,'Value')})
				case 'spectrum'
					drawSpectra(handles);
				case 'values'
					drawValues(handles);
			end
		case {'colormap','inversecolor'}
			if isfield(handles, 'imagedata')
				figure(handles.imgspectrumexpo_fig);
				axes(handles.spectrum);
				contents = get(handles.colormap,'String');
				cmap = colormap(lower(contents{get(handles.colormap,'Value')}));
				if (get(handles.inversecolor,'Value'))
					colormap(flipud(cmap));
				else
					colormap(cmap);
				end
			end
		case 'point'
			% Point is moving	
			%set(handles.figwin,'WindowButtonMotionFcn','imgspectrumexpofn movepoint');
			set(handles.figwin,'WindowButtonMotionFcn',{@movePointDraw,handles});
            set(handles.figwin,'WindowButtonUpFcn','imgspectrumexpofn release');
		%case 'movepoint'
		% This recursion was causing problems
		%	handles = movepoint(handles);
		%	updateSpecPlots(handles);
		case 'release'
			set(handles.figwin,'WindowButtonMotionFcn','');
			set(handles.figwin,'WindowButtonUpFcn','');
			handles.hori = get(handles.p,'YData');
			handles.vert = get(handles.p,'XData');
		case {'imgaliasexpo','imgfilterexpo'}
            if isfield(handles,'imagedata')
                imagedata = handles.imagedata;
                switch action
                    case 'imgaliasexpo'
                        imgaliasexpogui(imagedata);
                    case 'imgfilterexpo'
                        imgfilterexpogui(imagedata);
                end
            end
		case 'print'
			print_figure(f);
		case 'close'
			close_figure(f,figname(1:end-4));
			if isfield(handles, 'figwin'),
				close_figure(handles.figwin);
			end
            return;
	end
	set(f,'UserData',handles);

%-------------------------------------------------------------
function make2DSpecPlot(handles)
	figure(handles.imgspectrumexpo_fig);
	axes(handles.spectrum);
	spectrum = log(abs(fftshift(fft2(handles.imagedata.data))));
	% Get rid of inf
	points = isinf(spectrum);
	spectrum(points) = 0;
	imagesc(spectrum);
	contents = get(handles.colormap,'String');
	cmap = colormap(lower(contents{get(handles.colormap,'Value')}));
	if (get(handles.inversecolor,'Value'))
		colormap(flipud(cmap));
	else
		colormap(cmap);
	end
	axis image;

function handles = place_lines(figwin, handles)
	figure(figwin);
	hold on;
	[rows,cols] = size(handles.imagedata.data);
	handles.hori = floor(0.1*rows);
	handles.vert = floor(0.1*cols);
	handles.h = line(get(gca,'Xlim'), [handles.vert handles.vert],...
		'Color','r','EraseMode','xor');
	handles.v = line([handles.hori handles.hori], get(gca,'YLim'),...
		'Color','r','EraseMode','xor');
	handles.p = plot(handles.hori, handles.vert,'ro','MarkerSize',10,...
		'ButtonDownFcn','imgspectrumexpofn point','EraseMode','xor');