📄 grabit.m
字号:
function grabit(fname)%GRABIT Extracts data points from an image file.%% GRABIT starts a GUI program for extracting data from an image file.% It is capable of reading in BMP, JPG, TIF, GIF, and PNG files (anything% that is readable by IMREAD). Multiple data sets can be extracted from a% single image file, and the data is saved as an n-by-2 matrix variable in% the workspace. It can also be renamed and saved as a MAT file.%% Following steps should be taken:% 1. Load the image file.% 2. Calibrate axes dimensions. You will be prompted to select 4 points% on the image. Zoom and pan enabled.% 3. Grab points by clicking on points. Right-click to delete a point.% Image can be zoomed and panned.% 4. Multiple data sets will remain in memory so long as the GUI is open.% Variables can be renamed, saved to file, or edited in Array Editor.% % Panning is achieved by clicking and dragging on the image. Double-click% to center view. Right click and drag to zoom in and out. In addition,% there are keyboard shortcuts for zooming:% <a> - zoom in% <b> - zoom out% <space> - reset view%% This code will also work for extracting data points from a tilted or a% skewed image (even upside-down or mirrored). The calibration stage% ensures that the imperfect orientation or quality of the image is% accounted for.%% The types of files that will most likely work are BMP, JPG, TIF, GIF (up% to 8-bit), and PNG files. Basically, any format supported by the IMREAD% is accepted.%% GRABIT(FILENAME) will start the GUI program and open the image file% FILENAME.%% Type GRABIT('-sample') to load a sample image.%% % VERSIONS:% v1.0 - first version% v1.1 - use imshow instead of image (takes care of colormap)% v1.5 - convert to a GUI version% v1.6 - added functionality to open a file from the command window and% embedded a sample image file to the function% v1.6.1 - changed cross cursor to crosshair% v1.6.2 - brought back 'image' in case the user doesn't have Image Toolbox% v1.6.5 - fixed zoom problem in R14% v2.0 - major code change. added zoom feature during calibration. added% panning feature. (March 3, 2006)% v2.1 - store sample image as HEX to reduce file size. (March 6, 2006)% v2.1.1 - animate view change and zooming for a better visual perception% (March 11, 2006)% v2.1.5 - added features: double-click to center view. right-click and% drag to zoom. other minor code changes. (March 16, 2006)% v2.2 - fixed loadImageFcn bug. (May 4, 2006)% v2.3 - fixed bug to work with grayscale image (Jan, 2007)%% Created in Matlab R13. Tested up to R2006b%% Copyright 2003% Jiro Doke%% To Do: Capability to deal with logarithmic axes%%--------------------------------------------------------------------------% Initialize%--------------------------------------------------------------------------sh = get(0, 'ShowHiddenHandles');set(0, 'ShowHiddenHandles', 'on');% close existing windowsim = findobj('type', 'figure', 'tag', 'GrabitGUI');if ishandle(im) close(im);endset(0, 'ShowHiddenHandles', sh);% background colorsbgcolor1 = [.8, .8, .8];bgcolor2 = [ 1, 1, 1];bgcolor3 = [.7, .7, .7];bgcolor4 = [ 1, .5, .5];%--------------------------------------------------------------------------% Custom cursor pointers%--------------------------------------------------------------------------zoomPointer = [ 2 2 2 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 1 1 1 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 NaN NaN NaN NaN 2 2 2 2 NaN NaN NaN NaN NaN 2 1 2 NaN NaN 2 2 1 1 1 1 2 2 NaN NaN NaN 2 1 2 NaN 2 1 1 2 2 2 2 1 1 2 NaN NaN NaN 2 NaN NaN 2 1 2 2 1 1 2 2 1 2 NaN NaN NaN NaN NaN 2 1 2 2 2 1 1 2 2 2 1 2 NaN NaN NaN NaN 2 1 2 1 1 1 1 1 1 2 1 2 NaN NaN NaN NaN 2 1 2 1 1 1 1 1 1 2 1 2 NaN NaN NaN NaN 2 1 2 2 2 1 1 2 2 2 1 2 NaN NaN NaN NaN NaN 2 1 2 2 1 1 2 2 1 2 NaN NaN NaN NaN NaN NaN 2 1 1 2 2 2 2 1 1 1 2 NaN NaN NaN NaN NaN NaN 2 2 1 1 1 1 2 1 1 1 2 NaN NaN NaN NaN NaN NaN NaN 2 2 2 2 NaN 2 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 ];zoomInOutPointer = [ NaN NaN NaN 2 2 NaN NaN NaN NaN NaN NaN 1 1 1 NaN NaN NaN NaN 2 1 1 2 NaN NaN NaN NaN 1 2 2 2 1 NaN NaN 2 1 1 1 1 2 NaN NaN 1 2 2 1 2 2 1 2 1 1 1 1 1 1 2 NaN 1 2 1 1 1 2 1 2 1 2 1 1 2 1 2 NaN 1 2 2 1 2 2 1 NaN 2 2 1 1 2 2 NaN NaN 1 1 2 2 2 1 NaN NaN NaN 2 1 1 2 NaN NaN 1 1 1 1 1 1 NaN NaN NaN NaN NaN 2 2 NaN NaN NaN 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 2 NaN NaN NaN NaN NaN NaN 1 1 1 NaN NaN NaN NaN 2 1 1 2 NaN NaN NaN NaN 1 2 2 2 1 NaN NaN 2 2 1 1 2 2 NaN NaN 1 2 2 2 2 2 1 2 1 2 1 1 2 1 2 NaN 1 2 1 1 1 2 1 2 1 1 1 1 1 1 2 NaN 1 2 2 2 2 2 1 NaN 2 1 1 1 1 2 NaN NaN 1 1 2 2 2 1 NaN NaN NaN 2 1 1 2 NaN NaN 1 1 1 1 1 1 NaN NaN NaN NaN NaN 2 2 NaN NaN NaN 1 1 NaN NaN NaN NaN NaN NaN ]; % closed hand pointer (from J閞鬽e Briot)closedHandPointer = [ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 2 NaN 2 2 NaN 2 2 NaN NaN NaN NaN NaN NaN NaN 2 1 1 2 1 1 2 1 1 2 2 NaN NaN NaN NaN 2 1 2 2 1 2 2 1 2 2 1 1 2 NaN NaN NaN 2 1 2 2 2 2 2 2 2 2 1 2 1 2 NaN NaN NaN 2 1 2 2 2 2 2 2 2 2 2 1 2 NaN NaN 2 1 1 2 2 2 2 2 2 2 2 2 1 2 NaN 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 NaN 2 1 2 2 2 2 2 2 2 2 2 2 2 1 2 NaN 2 1 2 2 2 2 2 2 2 2 2 2 1 2 NaN NaN NaN 2 1 2 2 2 2 2 2 2 2 2 1 2 NaN NaN NaN NaN 2 1 2 2 2 2 2 2 2 1 2 NaN NaN NaN NaN NaN NaN 2 1 2 2 2 2 2 2 1 2 NaN NaN NaN NaN NaN NaN 2 1 2 2 2 2 2 2 1 2 NaN NaN ];% X-axis Origin pointerxoPointer = [ 2 2 2 2 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 1 1 1 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 1 2 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 NaN 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 2 2 NaN NaN 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 NaN NaN NaN 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 NaN 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 NaN NaN NaN NaN 1 1 1 NaN NaN NaN NaN NaN 1 1 1 1 1 NaN NaN 1 NaN NaN NaN 1 NaN NaN NaN 1 1 1 NaN 1 1 1 NaN 1 NaN NaN NaN 1 NaN NaN NaN 1 1 NaN NaN NaN 1 1 NaN 1 NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 NaN ];% X-axis Max pointerxmPointer = [ 2 2 2 2 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 1 1 1 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 1 2 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 NaN 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 2 2 NaN NaN 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 NaN NaN NaN 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 NaN 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 NaN NaN NaN 1 NaN NaN NaN 1 NaN NaN NaN NaN 1 1 1 1 1 NaN NaN 1 1 NaN 1 1 NaN NaN NaN 1 1 1 NaN 1 1 1 NaN 1 NaN 1 NaN 1 NaN NaN NaN 1 1 NaN NaN NaN 1 1 NaN 1 NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN 1 ]; % Y-axis Origin pointeryoPointer = [ 2 2 2 2 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 1 1 1 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 1 2 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 NaN 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 2 2 NaN NaN 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 NaN NaN NaN 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 NaN NaN 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 1 NaN NaN NaN 1 1 1 NaN NaN NaN NaN NaN NaN 1 1 1 NaN NaN NaN 1 NaN NaN NaN 1 NaN NaN NaN 1 1 1 1 1 NaN NaN NaN 1 NaN NaN NaN 1 NaN NaN NaN 1 1 1 NaN NaN NaN NaN NaN 1 NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 NaN ]; % Y-axis Max pointerymPointer = [ 2 2 2 2 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 1 1 1 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 1 2 2 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 1 2 NaN 2 1 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN 2 2 2 NaN NaN 2 2 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 NaN NaN NaN 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 NaN NaN 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 1 1 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 1 1 1 NaN NaN 1 NaN NaN NaN 1 NaN NaN NaN NaN NaN 1 1 1 NaN NaN NaN 1 1 NaN 1 1 NaN NaN NaN 1 1 1 1 1 NaN NaN NaN 1 NaN 1 NaN 1 NaN NaN NaN 1 1 1 NaN NaN NaN NaN NaN 1 NaN NaN NaN 1 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 1 NaN NaN NaN 1 ];% zoom button iconzoomIcon = [ 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 1 1 0 0 0 1 1 1 1 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 ]; % create zoom icon (RGB matrix)fgID = zoomIcon==0;bgID = ~fgID;zI1 = zeros([size(zoomIcon), 3]);zI2 = zeros([size(zoomIcon), 3]);for id = 1:3 tmp = zoomIcon; tmp(fgID) = 0; tmp(bgID) = bgcolor3(id); zI1(:,:,id) = tmp; tmp(bgID) = bgcolor4(id); zI2(:,:,id) = tmp;end% get screen size in pixelsun = get(0, 'units');set(0, 'units', 'pixels');screenSize = get(0, 'ScreenSize');sW = screenSize(3);sH = screenSize(4);set(0, 'units', un);% figure width and height (in pixels)fW = sW-200;fH = sH-100;im = figure(... 'units' , 'pixels', ... 'position' , [100, 50, fW, fH], ... 'backingstore' , 'off', ... 'doublebuffer' , 'on', ... 'name' , 'Grabit', ... 'numbertitle' , 'off', ... 'menubar' , 'none', ... 'color' , bgcolor1, ... 'pointer' , 'arrow', ... 'visible' , 'off', ... 'interruptible' , 'off', ... 'busyaction' , 'cancel', ... 'resizefcn' , @figResizeFcn, ... 'windowbuttonupfcn' , @winBtnUpFcn, ... 'keypressfcn' , @keyPressFcn, ... 'deletefcn' , 'delete(timerfind(''name'', ''BtnUpTimer''));', ... 'tag' , 'GrabitGUI', ... 'defaultUicontrolUnits' , 'pixels', ... 'defaultUicontrolBackgroundColor' , bgcolor3, ... 'defaultUicontrolFontname' , 'Verdana', ... 'defaultUicontrolFontUnits' , 'pixels', ... 'defaultUicontrolFontsize' , 10, ... 'defaultUicontrolInterruptible' , 'off', ... 'defaultUicontrolBusyAction' , 'cancel', ... 'defaultAxesFontName' , 'Verdana', ... 'defaultAxesUnits' , 'pixels', ... 'defaultAxesFontSize' , 8);panelW = 0.8*fW;uicontrol(... 'style' , 'frame', ... 'position' , [10, fH-110, panelW, 100], ... 'backgroundcolor' , bgcolor2);uicontrol(... 'style' , 'pushbutton', ... 'string' , 'Load Image...', ... 'callback' , {@loadImageFcn, []}, ... 'position' , [15, fH-40, 200, 25], ...
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -