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

📄 modelexpofn.m

📁 非常好的数字处理教程
💻 M
字号:
%function modelexpofn(action,datastruct)    if nargin < 1        action='init';    end	name = mfilename;    figname = [name(1:end-2) '_fig'];    f=findobj('Tag',figname);    handles = get(f,'UserData');	% If main window closes, close all other window    switch action		case 'help'			display_help(figname);        case 'init'			setdefaults('menu');            movegui(f,'center');		case 'draw'			imgsize = str2double(get(handles.imgsize,'String'));			imgdata.data = zeros(imgsize,imgsize);			imgdata.map = colormap('gray');			if get(handles.twostate,'Value'),				bits = 8;				prev_val = round(rand*(2^bits-1));				p = str2double(get(handles.p,'String'));				q = str2double(get(handles.q,'String'));				if ~get(handles.animate,'Value')					h = waitbar(0,'Computing...');					for i=1:imgsize,						for j=1:imgsize,							% Roll dice							dice = rand;							if prev_val == 0,								if dice < p									imgdata.data(i,j) = 2^bits-1;								else									imgdata.data(i,j) = 0;								end							else								if dice < q									imgdata.data(i,j) = 0;								else									imgdata.data(i,j) = 2^bits-1;								end							end							prev_val = imgdata.data(i,j);						end						%prev_val = imgdata.data(i,1);						waitbar(i/imgsize,h);					end					close(h);					%imgdata.data = uint8(imgdata.data);					handles.figwin = showimage(imgdata,0);				else					handles.figwin = showimage(imgdata,0);					for i=1:imgsize,						for j=1:imgsize,							imgdata.data(i,j) = 2^bits-1;							showimage(imgdata,0);							% Roll dice							dice = rand;							if prev_val == 0,								if dice < p									imgdata.data(i,j) = 2^bits-1;								else									imgdata.data(i,j) = 0;								end							else								if dice < q									imgdata.data(i,j) = 0;								else									imgdata.data(i,j) = 2^bits-1;								end							end                            drawnow;							showimage(imgdata,0);							prev_val = imgdata.data(i,j);						end					end				end				handles.imagedata = imgdata;	            			elseif get(handles.ar,'Value'),				bits = 8;				prev_val = 2^bits-1;				alpha = str2double(get(handles.alpha,'String'));				stdev = str2double(get(handles.std,'String'));				meanval = (2^bits)/2-1;				scale = get(handles.scale,'Value');				if ~get(handles.animate,'Value')					h = waitbar(0,'Computing...');					for i=1:imgsize,						for j=1:imgsize,							pixel_val = round(prev_val*alpha + ...								randn*stdev*(2^bits-1));							if pixel_val > 2^bits-1,								pixel_val = 2^bits-1;							elseif pixel_val < 0								pixel_val = 0;							end							%imgdata.data(i,j) = pixel_val+meanval;							imgdata.data(i,j) = pixel_val;							prev_val = pixel_val;						end						waitbar(i/imgsize,h);					end					close(h);					handles.figwin = showimage(imgdata,scale);				else					handles.figwin = showimage(imgdata,scale);					for i=1:imgsize,						for j=1:imgsize,							imgdata.data(i,j) = 2^(bits-1);							showimage(imgdata,scale);							pixel_val = round(prev_val*alpha + ...								randn*stdev*(2^bits-1));							if pixel_val > 2^bits-1,								pixel_val = 2^bits-1;							elseif pixel_val < 0								pixel_val = 0;							end							%imgdata.data(i,j) = pixel_val+meanval;							imgdata.data(i,j) = pixel_val;                            drawnow;							showimage(imgdata,scale);							prev_val = pixel_val;						end					end				end			elseif get(handles.us,'Value'),				bits = str2num(get(handles.bits,'String'));				prev_val = 2^bits-1;				alpha = str2double(get(handles.us_a,'String'));				stdev = str2double(get(handles.us_std,'String'));				contents = get(handles.distribution,'String');				distribution = lower(contents{get(handles.distribution,'Value')});				meanval = (2^bits-1)/2;				scale = get(handles.us_scale,'Value');				if ~get(handles.animate,'Value')					h = waitbar(0,'Computing...');					for i=1:imgsize,						for j=1:imgsize,							switch distribution,								case 'gaussian'									pixel_val = round(prev_val*alpha + ...										randn*stdev*(2^bits-1)/2+meanval);								case 'uniform'									pixel_val = round(prev_val*alpha + ...										rand*(2^bits-1));							end							if pixel_val > 2^bits-1,								pixel_val = 2^bits-1;							elseif pixel_val < 0								pixel_val = 0;							end							imgdata.data(i,j) = pixel_val;							prev_val = pixel_val;						end						waitbar(i/imgsize,h);					end					close(h);					handles.figwin = showimage(imgdata,scale);				else					handles.figwin = showimage(imgdata,scale);					for i=1:imgsize,						for j=1:imgsize,							imgdata.data(i,j) = 2^(bits-1);							showimage(imgdata,scale);							switch distribution,								case 'gaussian'									pixel_val = round(prev_val*alpha + ...										randn*stdev*(2^bits-1)+meanval);								case 'uniform'									pixel_val = round(prev_val*alpha + ...										rand*(2^bits-1));							end							if pixel_val > 2^bits-1,								pixel_val = 2^bits-1;							elseif pixel_val < 0								pixel_val = 0;							end							imgdata.data(i,j) = pixel_val;                            drawnow;							showimage(imgdata,scale);							prev_val = pixel_val;						end					end				end			end			handles.imagedata = imgdata;			handles.entropy = calc_entropy(imgdata.data, bits);			axes(get(handles.figwin,'Children'));			title(['Entropy = ' num2str(handles.entropy)]);		case 'scale'			if get(handles.ar,'Value')				scale = get(handles.scale,'Value');			elseif get(handles.us,'Value')				scale = get(handles.us_scale,'Value');			end			if isfield(handles,'figwin')				axes(get(handles.figwin,'Children'));				showimage(handles.imagedata,scale);				title(['Entropy = ' num2str(handles.entropy)]);			end		case 'save'			save_imagedata(handles.imagedata);		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 entropy = calc_entropy(data, bits);	[m,n] = size(data);	% for each level find probability	entropy = 0;	for i=0:2^bits-1,		A = data==i;		p = sum(sum(A))/(m*n);		if p > 0			entropy = entropy - p*log2(p);		end	endfunction figwin = showimage(imagedata, varargin)	if nargin < 2		scale = 1;		inverse = 0;		fignum = 2;	elseif nargin < 3		scale = varargin{1};		inverse = 0;		fignum = 2;	elseif nargin < 4		scale = varargin{1};		inverse = varargin{2};		fignum = 2;	else		scale = varargin{1};		inverse = varargin{2};		fignum = varargin{3};	end    figwin = figure(fignum);	cla;    set(figwin,'MenuBar','none','DoubleBuffer','on','Units','Pixels');	if ~isempty(imagedata.map)		cmap = colormap(imagedata.map);	else		cmap = colormap('gray');	end	if inverse,		colormap(flipud(cmap));	end	if scale,		imagesc(imagedata.data);	else		image(imagedata.data);	end	axis image;

⌨️ 快捷键说明

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