bskyvision RSS 태그 관리 글쓰기 방명록
2017-09-27 18:39:30
728x90

영상처리를 하다보면 폴더 내에 있는 이미지 파일 이름들을 쭉 읽어내야 하는 경우가 있다. 그런 경우에 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개 이렇게 많이 들어있는 경우에는 이미지를 하나씩 읽어서 사용하는 것은 사실상 불가능하기에 여기서 소개하는 방법을 활용하는 것을 추천한다. 


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


댓글

방문해주신 모든 분들을 환영합니다.

* 글을 읽던 중에 궁금했던 부분은 질문해주세요.

* 칭찬, 지적, 의문, 격려, 감사표현 등을 남겨주세요.

* 최대한 답변 드리도록 노력하겠습니다.

* 욕설과 광고를 담은 댓글은 가차없이 삭제합니다.


  1. 뀨@2021.11.11 15:03 ~$ 안녕하세요! 작성해주신 글 참고해서 공부하던중 질문이 있어 남깁니다.
    같은 코드를 제 상황에 해당되는 경로만 수정하여 실행하니.
    img_name = [img_name;list(i).name] <-이 부분에서 결합하려는 배열의 차원이 일치하지 않는다는 에러가 발생합니다.
    이러한 이유가 발생하는 이유를 알 수 있을까요? [댓글주소]  [수정/삭제]  [답글작성]
    • BlogIcon bskyvision@2021.11.12 00:38 신고 ~$ [답글]: list = dir(folder_name);

      list 안에 몇번째 요소부터 이미지 이름인지 확인하신 후에 거기에 맞춰서 3을 해주시든지 다른 숫자를 해주시든지 해야할 것 같습니다~! [댓글주소]  [수정/삭제]
guest@이름 ~$
guest@패스워드 ~$
guest@홈페이지주소작성 ~$

guest@댓글작성 ~$




bskyvision. Designed by bskyvision.