2017-09-27 18:39:30

영상처리를 하다보면 폴더 내에 있는 이미지 파일 이름들을 쭉 읽어내야 하는 경우가 있다. 그런 경우에 dir 함수를 이용하면 쉽게 읽어낼 수 있다. 그림 1과 같이 여러 장의 이미지가 포함되어 있는 폴더가 있다. 


그림 1. 여러 장의 이미지가 담겨 있는 폴더.


여기서 이미지 파일의 이름과 확장자를 한번에 읽어보는 코드를 구현해보자. 핵심은 dir 함수를 사용해야한다는 것이다. 이름을 보아하니 directory에서 기인한 것 같다. 즉 파일의 목록을 보여주는 함수이다. dir(폴더명), 이렇게 사용해주면 된다. 

 

dir_ex.m

clc, clear, close all


folder_name = 'D:\노래, 사진, 영화\사진Photo\2017-04-04_고문화거리'; 

list = dir(folder_name);


위와 같은 두 줄의 코드를 작성하고 실행한 후 list라는 변수에 들어있는 내용을 확인해보자(그림 2). 


그림 2. list 변수의 내용물


보아하니 dir로 얻은 list변수 안에는 파일의 이름, 폴더명, 날짜, 용량 등이 포함되어 있다. 우리가 필요한 것은 이미지 파일의 이름이니, 이것만 읽어내보자. 3부터 18까지가 이미지 파일을 지칭하고 있다. list변수는 구조체 형식이기 때문에, .을 활용해야 한다. list.name으로 파일명을 읽어낼 수 있다. 필자는 파일명을 열벡터에 담기도록 만들었다. 위에서 작성한 코드에 이 부분을 추가했다. 

 

dir_ex.m

clc, clear, close all


folder_name = 'D:\노래, 사진, 영화\사진Photo\2017-04-04_고문화거리'; 


list = dir(folder_name);


img_name = [];


for i = 3:18

    img_name = [img_name; list(i).name]; 

end


추가된 코드를 간단히 설명하자면, img_name이라는 빈 공간을 만들어낸 다음, 파일명이 하나씩 차곡차곡 밑으로 추가되게 만들었다. 결과적으로 생긴 img_name 변수 안을 들여다보자(그림 3).


그림 3. 이미지 파일명을 담은 변수.


이미지 파일명이 차곡차곡 하나씩 담겨있는 것을 볼 수 있다. 그럼 이제 간단히 이미지파일을 읽은 후 subplot을 이용해서 한번에 보여주는 코드를 작성해보자.


dir_ex.m

clc, clear, close all


folder_name = 'D:\노래, 사진, 영화\사진Photo\2017-04-04_고문화거리'; 


list = dir(folder_name);

img_name = [];


for i = 3:18

    img_name = [img_name; list(i).name];

end


figure,

for i = 1:16

    img = imread([folder_name, '\', img_name(i, :)]);

    subplot(4, 4, i)

    imshow(img);

end


16개의 이미지를 한번에 보여주기 위해서 이미지를 4열, 4행으로 전시되게 했다. 결과적으로 그림 4가 화면에 떴다. 


그림 4. 폴더 내의 이미지들을 읽어서 모니터에 출력한 결과


만약에 이미지가 폴더 내에 1000개, 10000개 이렇게 많이 들어있는 경우에는 이미지를 하나씩 읽어서 사용하는 것은 사실상 불가능하기에 여기서 소개하는 방법을 활용하는 것을 추천한다. 


코드에 이해가 안되는 부분 있다면, 댓글을 남겨주시면 좀 더 상세히 설명하겠습니다!