📄 imui.m
字号:
varlist = strvcat(varlist, workspacevars(i).name);
end
end
hsubmenu = get(ud.MenuHandles.Import, 'Children');
if ~isempty(varlist)
for i = 1 : size(varlist, 1);
varinf = evalin('base', ['whos(''',varlist(i, :), ''')']);
varname = char(varinf.name);
if ~isempty(varname)
uimenu( ud.MenuHandles.Import, ...
'Label', [varname, ' -- ',...
mat2str(varinf.size), ', ', char(varinf.class)], ...
'Tag', varname, ...
'Callback', 'imui( ''::::mnucb_Import_ChildCbFCN'' )');
end
end
else
uimenu( ud.MenuHandles.Import, ...
'Label', 'Workspace contains no numberic variable', ...
'Enable', 'off');
end
if ~isempty(hsubmenu)
delete(hsubmenu)
end
case '::::mnucb_Import_ChildCbFCN'
imvar = get(gcbo, 'Tag');
evalin('base', [ 'imui(', imvar, ');' ] );
case '::::mnucb_Export'
prompt = {sprintf('Enter varaible name :\n')};
default = {strtok(ud.ImageTitle, '. ')};
dlgtitle = 'Export to workspace';
answer = inputdlg(prompt, dlgtitle, 1, default);
if ~isempty(answer)
varName = answer{1};
if isvarname(varName)
assignin('base', varName, get(ud.ImageHandle, 'UserData'));
else
prompt = sprintf(['\\bf', varName , '\\rm is not a valid varaible name. \n\n', ...
'A valid variable name is a character string of letters, digits and', ...
'underscores, with length <= 31 and the first character a letter.']);
h = errordlg(prompt, 'IMUI', ...
struct('Interpreter', 'tex', 'WindowStyle', 'modal') );
end
end
case '::::mnucb_imshow'
figure
imshow(get(ud.ImageHandle, 'UserData'));
case '::::mnucb_imageview'
imageview(get(ud.ImageHandle, 'UserData'));
case '::::mnucb_Prefences'
imuiPref
case '::::mnucb_Rename'
prompt = sprintf( 'Enter new name :\n');
newname = inputdlg(prompt, 'Rename image', 1, {ud.ImageTitle});
if ~isempty(newname)
ud.ImageTitle = char(newname);
UpdateGUIState(ud)
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% EDIT menu callbacks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case '::::mnucb_Fade'
CX = imuifade(ud);
if ~isempty(CX)
imui('::::UpdateImage', CX)
end
case '::::mnucb_History_ChildCbFCN'
set(allchild(ud.MenuHandles.History), 'Checked', 'off')
set(gcbo, 'Checked', 'on')
ud.HistoryIndex = get(gcbo, 'UserData');
mnuHistoryData = ud.HistoryData(ud.HistoryIndex);
LOADDATA = load(mnuHistoryData.FileName);
set(ud.ImageHandle, 'UserData', LOADDATA.CX)
DisplayFunction(ud.ImageHandle)
ud.ImageType = ImageType(LOADDATA.CX);
ud.ImageClass = class(LOADDATA.CX);
UpdateGUIState(ud)
case '::::mnucb_Resize'
CX = get(ud.ImageHandle, 'UserData');
CX = imuiresize(CX);
if CX ~= -1
imui('::::UpdateImage', CX)
end
case '::::mnucb_Crop'
DisableAllMenus(ud)
set(ud.FigureHandle, 'Name', ...
'IMUI - Crop : click and drag.')
rect = getrect(ud.FigureHandle);
CX = get(ud.ImageHandle, 'UserData');
imui('::::UpdateImage', imcrop(CX, rect));
EnableAllMenus(ud)
case '::::mnucb_FlipVertical'
CX = get(ud.ImageHandle, 'UserData');
if strcmp(ud.ImageType, 'RGB')
imui('::::UpdateImage', ...
cat(3, ...
flipud(CX(:,:,1)), flipud(CX(:,:,2)), flipud(CX(:,:,3)) ) )
else
imui('::::UpdateImage', flipud(CX))
end
case '::::mnucb_FlipHorizontal'
CX = get(ud.ImageHandle, 'UserData');
if strcmp(ud.ImageType, 'RGB')
imui('::::UpdateImage', ...
cat(3, ...
fliplr(CX(:,:,1)), fliplr(CX(:,:,2)), fliplr(CX(:,:,3)) ) )
else
imui('::::UpdateImage', fliplr(CX))
end
case '::::mnucb_Rotate_180'
CX = get(ud.ImageHandle, 'UserData');
if strcmp(ud.ImageType, 'RGB')
imui('::::UpdateImage', ...
cat(3, ...
rot90(CX(:,:,1), 2), rot90(CX(:,:,2), 2), rot90(CX(:,:,3), 2) ) )
else
imui('::::UpdateImage', rot90(CX, 2))
end
case '::::mnucb_Rotate_90L'
CX = get(ud.ImageHandle, 'UserData');
if strcmp(ud.ImageType, 'RGB')
imui('::::UpdateImage', ...
cat(3, ...
rot90(CX(:,:,1)), rot90(CX(:,:,2)), rot90(CX(:,:,3)) ) )
else
imui('::::UpdateImage', rot90(CX))
end
case '::::mnucb_Rotate_90R'
CX = get(ud.ImageHandle, 'UserData');
if strcmp(ud.ImageType, 'RGB')
imui('::::UpdateImage', ...
cat(3, ...
rot90(CX(:,:,1), 3), rot90(CX(:,:,2), 3), rot90(CX(:,:,3), 3) ) )
else
imui('::::UpdateImage', rot90(CX, 3))
end
case '::::mnucb_Rotate_N'
prompt = {sprintf('Enter rotate angle(clockwise, in degree) :\n')};
default = {'0'};
dlgtitle = 'Rotate image';
answer = inputdlg(prompt, dlgtitle, 1, default);
if ~isempty(answer)
if all(size(str2num(answer{1}))== [1 1])
h = waitfig('Rotating');
CX = get(ud.ImageHandle, 'UserData');
imui('::::UpdateImage', ...
imrotate(CX, -str2num(answer{1}), ud.DefaultOversampleMethod) )
delete(h)
else
prompt = sprintf(['\\bf', answer{1} , '\\rm is not a angle. \n']);
h = errordlg(prompt, 'IMUI', ...
struct('Interpreter', 'tex', 'WindowStyle', 'modal') );
end
end
case '::::mnucb_Split_RGB'
CX = get(ud.ImageHandle, 'UserData');
imui(CX(:, :, 1), [ud.ImageTitle, ': R Channel'])
imui(CX(:, :, 2), [ud.ImageTitle, ': G Channel'])
imui(CX(:, :, 3), [ud.ImageTitle, ': B Channel'])
case '::::mnucb_Split_HSV'
h = waitfig('Converting to H-S-V image');
CX = rgb2hsv(get(ud.ImageHandle, 'UserData'));
delete(h);
imui(CX(:, :, 1), [ud.ImageTitle, ': H Channel'])
imui(CX(:, :, 2), [ud.ImageTitle, ': S Channel'])
imui(CX(:, :, 3), [ud.ImageTitle, ': V Channel'])
case '::::mnucb_Split_YCbCr'
h = waitfig('Converting to Y-Cb-Cr image');
CX = rgb2ycbcr(get(ud.ImageHandle, 'UserData'));
delete(h);
imui(CX(:, :, 1), [ud.ImageTitle, ': Y Channel'])
imui(CX(:, :, 2), [ud.ImageTitle, ': Cb Channel'])
imui(CX(:, :, 3), [ud.ImageTitle, ': Cr Channel'])
case '::::mnucb_Merge'
imuimerge( getImuiFigureHandles )
case '::::mnucb_ToBinary'
h = waitfig('Converting to Binary image');
CX = get(ud.ImageHandle, 'UserData');
imui('::::UpdateImage', im2bw(CX, 0.5))
delete(h)
case '::::mnucb_ToGray'
h = waitfig('Converting to Grayscale image');
switch ud.ImageType
case 'RGB'
CX = get(ud.ImageHandle, 'UserData');
imui('::::UpdateImage', rgb2gray(CX))
case 'Binary'
CX = get(ud.ImageHandle, 'UserData');
imui('::::UpdateImage', ind2gray(CX, [1e-6 1e-6 1e-6; 1 1 1]) )
end
delete(h)
case '::::mnucb_ToRGB'
h = waitfig('Converting to RGB Color image');
switch ud.ImageType
case 'Gray'
CX = get(ud.ImageHandle, 'UserData');
imui('::::UpdateImage', cat(3, CX, CX, CX) )
case 'Binary'
CX = get(ud.ImageHandle, 'UserData');
CX = ind2gray(CX, [1e-6 1e-6 1e-6; 1 1 1]);
imui('::::UpdateImage', cat(3, CX, CX, CX) )
end
delete(h)
case '::::mnucb_ToUINT8'
h = waitfig('Converting to UINT8');
imui('::::UpdateImage', ...
im2uint8(get(ud.ImageHandle, 'UserData')) )
delete(h)
case '::::mnucb_ToUINT16'
h = waitfig('Converting to UINT16');
imui('::::UpdateImage', ...
im2uint16(get(ud.ImageHandle, 'UserData')) )
delete(h)
case '::::mnucb_ToDOUBLE'
h = waitfig('Converting to DOUBLE');
imui('::::UpdateImage', ...
im2double(get(ud.ImageHandle, 'UserData')) )
delete(h)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% ANALYZE menu callbacks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case '::::mnucb_FFT2' % Fourier Transform
h = waitfig('Computing FFT');
CX = get(ud.ImageHandle, 'UserData');
CX = log(abs( fftshift(fft2(CX)) ));
CX = CX./max(max(CX));
figure
imshow(CX)
colormap(jet)
colorbar
delete(h)
case '::::mnucb_DCT'
h = waitfig('Computing DCT');
CX = get(ud.ImageHandle, 'UserData');
figure
imshow(log(abs(dct2(CX))),[])
colormap(jet)
colorbar
delete(h)
case '::::mnucb_impixel' % ColorPicker
DisableAllMenus(ud)
set(ud.FigureHandle, 'Name', ...
'IMUI - Color picker : click on point(s) and press ENTER.')
[c, r, P] = impixel;
if ~isempty(P)
liststr{1} = ' X Y Red Green Blue';
liststr{2} = '--------------------------------------';
switch ud.ImageClass
case 'uint8'
P = double(P);
case 'uint16'
P = double(P) ./ 255;
case 'double'
P = P * 255;
end
P = round(P);
for i = 1 : length(r)
liststr{i + 2} = [blanks(0), ...
sprintf('[%4d, ', c(i)), blanks(0), ...
sprintf('%4d]', r(i)), blanks(6) ...
sprintf('[%3d, %3d, %3d]', P(i, :)) ...
];
end
hfig = dialog( ...
'Position', [0 0 300 250], ...
'Name', 'Color picker', ...
'HandleVisibility', 'on', ...
'WindowStyle', 'modal', ...
'Visible', 'off');
hcolor = uicontrol( ...
'Style', 'text', ...
'Units', 'pixel', ...
'Position', [25 10 250 16], ...
'String', 'Sample color' ...
);
hlst = uicontrol( ...
'Style', 'listbox', ...
'Units', 'pixel', ...
'Position', [0 35 300 215], ...
'BackgroundColor', 'w', ...
'FontName', 'Courier New', ...
'FontSize', 9, ...
'String', liststr, ...
'UserData', P ./ 255, ...
'Callback', 'imui(''::::cb_ColorPicker'')' ...
);
movegui(hfig, 'center')
set(hfig, ...
'Visible', 'on', ...
'UserData', hcolor)
end
EnableAllMenus(ud)
case '::::cb_ColorPicker'
id = get(gcbo, 'Value');
if id > 2
clr = get(gcbo, 'UserData');
set(get(gcf, 'UserData'), ...
'BackgroundColor', clr(id - 2, :), ...
'ForegroundColor', 1 - clr(id - 2, :))
else
set(get(gcf, 'UserData'), ...
'BackgroundColor', get(0, 'DefaultUIControlBackgroundColor'), ...
'ForegroundColor', 'k')
end
case '::::mnucb_improfile'
DisableAllMenus(ud)
set(ud.FigureHandle, 'Name', ...
'IMUI - Profile : drag lines and press ENTER')
try
improfile(ud.DefaultOversampleMethod)
end
EnableAllMenus(ud)
case '::::mnucb_Contour'
CX = get(ud.ImageHandle, 'UserData');
h = waitfig('Drawing contours, this make take a little while.');
if isrgb(CX)
CX = rgb2gray(CX);
end
h2 = figure('Visible', 'off');
imcontour(CX);
set(h2, 'Visible', 'on')
delete(h);
case '::::mnucb_Histogram'
imuihist(get(ud.ImageHandle, 'UserData'))
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% ADJUST menu callbacks
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
case '::::mnucb_Invert'
h = waitfig('Inverting');
imui('::::UpdateImage', ...
imcomplement(get(ud.ImageHandle, 'UserData')));
delete(h)
case '::::mnucb_Equalize'
h = waitfig('Equalizing');
imui('::::UpdateImage', ...
histeq(get(ud.ImageHandle, 'UserData')));
delete(h)
case '::::mnucb_AutoLevels'
h = waitfig('Applying Auto Levels');
CX = get(ud.ImageHandle, 'UserData');
imui('::::UpdateImage', ...
imadjust( CX, stretchlim(CX) ) );
delete(h)
case '::::mnucb_Threshold'
CX = get(ud.ImageHandle, 'UserData');
CX = imuifilter(CX, @imuithreshold);
if CX ~= -1
imui('::::UpdateImage', CX)
end
case '::::mnucb_BC'
CX = get(ud.ImageHandle, 'UserData');
CX = imuibc(CX);
if CX ~= -1
imui('::::UpdateImage', CX)
end
case '::::mnucb_Levels'
CX = get(ud.ImageHandle, 'UserData');
CX = imuilevels(CX);
if CX ~= -1
imui('::::UpdateImage', CX)
end
case '::::mnucb_Curves'
CX = get(ud.ImageHandle, 'UserData');
CX = imuicurves(CX);
if CX ~= -1
imui('::::UpdateImage', CX)
end
case '::::mnucb_HS'
CX = get(ud.ImageHandle, 'UserData');
CX = imuihs(CX);
if CX ~= -1
imui('::::UpdateImage', CX)
end
case '::::mnucb_ColorBalance'
CX = get(ud.ImageHandle, 'UserData');
CX = imuicbalance(CX);
if CX ~= -1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -