MATLAB File Open Dialog example
findValidArea.m (이용자가 선택한 디렉토리의 JPG 파일을 검사하여 유효한 영역을 잘라내어 다시 crop 디렉토리에 저장한다)
흰색 배경에 검은색 물체가 있는 영역을 검사하여 해당 영역만을 잘라내어 별도의 jpg 파일에 저장하는 예이다.
% 이 프로그램은 MATLAB R2012a에서 작성되었으며 MATLAB 용어로 M 파일이므로 MATLAB안에 M파일로 저장하여 % 필요시에는 MATLAB의 Command Window에서 호출하여 실행할 수 있다. % 다른 컴퓨터에서 실행하려면 이 파일을 컴파일하여 *.exe 파일을 생성하면 되는데, MATLAB의 mcc 컴파일러 % 를 사용하면 된다. MATLAB의 Command Window에서 다음과 같이 명령하면 *.m 파일은 *.exe 파일로 컴파일된다. % >> mcc -m [ M 파일 이름 ]<enter> % >> mcc -m cropValidArea.m<enter> % 촬영된 이미지의 유효영역이 일정한 영역에 위치한다면 아래의 변수를 사용하여 루프를 실행할 때 % 루프의 횟수를 단축할 수 있도록 유효영역에 근접하게 아래의 변수를 설정하고 루프에서 사용하면 된다 xStart = 0; yStart = 0; xEnd = 0; yEnd = 0; % 파일열기 대화창을 이용하여 이용자로부터 대상 디렉토리를 선택할 수 있게 한다 % 선택한 디렉토리 안에 있는 모든 jpg 파일들을 대상으로 로직을 실행한다 dname = uigetdir('C:\'); % 파일열기 대화창을 보여주고 선택된 디렉토리 경로를 리턴한다 src_path = sprintf('%s/*.jpg', dname); % 소스 경로 dst_path = sprintf('%s/crop',dname); % 저장 경로 mkdir(dst_path); % 소스 디렉토리 안에 저장용 디렉토리 생성 file_struct_arr = dir(src_path); % 소스 디렉토리 안의 모든 jpg 파일 리스트를 구조체 배열로 리턴함 for i=1:size(file_struct_arr) % 모든 이미지를 로드하고 유효영역을 검사 및 잘라내서 crop 디렉토리에 저장한다 rgbImg = imread(file_struct_arr(i).name); grImg = rgb2gray(rgbImg); %mxv = max(max(grImg)); %mnv = min(min(grImg)); %tmp = sprintf('최대=%d, 최소=%d', mxv, mnv); %disp(tmp); %avg = (double(mnv + (mxv-mnv)/2.0))/255.0; binImg = im2bw(grImg, 0.92); %imshow(binImg); % 이진화 이미지 출력 sz = size(binImg); disp(sz); h = sz(1); % 행수 w = sz(2); % 열수 msg = sprintf('폭=%d, 높이=%d',w,h); disp(msg); left=0; right = 0; top = 0; bottom = 0; % 이미지에서 검은색이 시작되는 좌측 좌표를 찾는다 go = 1; for x=1:w if(go==0) break; end; for y=1:h if(binImg(y,x)==0) disp(sprintf('발견(L), x=%d, y=%d',x,y)); left = x; go = 0; break; end; end; end; % 이미지에서 검은색이 시작되는 우측 좌표를 찾는다 go = 1; for x=w:-1:1 if(go==0) break; end; for y=1:h if(binImg(y,x)==0) disp(sprintf('발견(R), x=%d, y=%d',x,y)); right = x; go = 0; break; end; end; end; % 이미지에서 검은색이 시작되는 상단 좌표를 찾는다 go = 1; for y=1:h if(go==0) break; end; for x=1:w if(binImg(y,x)==0) disp(sprintf('발견(T), x=%d, y=%d',x,y)); top = y; go = 0; break; end; end; end; % 이미지에서 검은색이 시작되는 하단 좌표를 찾는다 go = 1; for y=h:-1:1 if(go==0) break; end; for x=1:w if(binImg(y,x)==0) disp(sprintf('발견(B), x=%d, y=%d',x,y)); bottom = y; go = 0; break; end; end; end; disp(sprintf('유효한 이미지 영역= %d, %d, %d, %d', left, top, right, bottom)) cropImg = imcrop(grImg, [left,top,right-left,bottom-top]); %imshow(cropImg); dst_file = sprintf('%s/%s', dst_path, file_struct_arr(i).name); imwrite(cropImg, dst_file,'jpg'); end; % End of for loop