'2021/06'에 해당되는 글 2건

  1. 2021.06.16 Matlab과 Python에서의 image 좌표축 한번에 정리!
  2. 2021.06.11 Ubuntu setup (Linux setup)

서론

Matlab이든 Python이든 image 처리를 할때 좌표축 때문에 머리가 아파오는 경우가 꼭 생긴다. 바로 일반적인 좌표계인 x,y 기준으로 위치를 잡을지, image도 array의 일종이니 row, col 기준으로 위치를 잡을지 생각해야 하는 시점이다. 사실 정말 단순한 문제인데 의외로 헷갈리고 각도라도 계산해야 하는 시점이 생기면 지옥이 펼쳐진다. 이 글은 매번 image 처리 파트를 할 때마다 좌표축을 헷갈리는 멍청한 본인을 한번에 이해시키기 위해서 쓰는 글이다.

 

Rule #1

좌측 : 데이터 저장 형태, 중간과 우측 : 데이터 입출력 형태

Matlab, Python, opencv, 캡쳐 프로그램, 지금까지 써본 모든 이미지 관련 프로그램들은 전부 이미지를 세 가지 형태중 하나의 형태로 사용한다. 그 이외의 형태는 아직까지 한번도 본적이 없다. 정확하게 말하자면 데이터 자체는 좌측과 같이 가지고 있고(실제 메모리에서의 구조보다는 indexing 기준), 사용자와 interaction을 해야하는 경우, 즉 마우스로 클릭을 하거나, line을 plot 하거나, figure의 현재 위치를 알려주거나 하는 경우는 중간이나 우측의 형태로 표기한다.

 

좌표축이 헷갈리는 가장 큰 원인은 개인적으로 데이터 입출력 형태가 두 가지가 있기 때문이라고 생각한다. indexing은 좌측, 입출력은 무조건 중간과 우측 중 하나의 형태만 취하면 그나마 혼동의 여지가 없겠으나, 입출력 형태가 2개가 있어서 혼란이 시작된다. 게다가 중간의 형태는 좌측의 형태와 정확히 일치하고 두 좌표값만 서로 바꾼 형태라 자칫 잘못하면 indexing을 method 1 방식으로 하게 되거나, method 1 방식으로 선을 그어주어야 하는데 indexing 하듯이 값을 넣을 수 있다.

 

가능한 모든 상황에서 테스트 해보면서 언제 어떤 식으로 좌표축이 표시되는지 확인해서 아래 정리해보았다.

사용하는 좌표축 형태 정리

  Matlab R2020a Python 3.7.3
(matplotlib=3.1.0)
Indexing indexing indexing
Method 1 (reversed Y axis) imshow, imagesc imshow
figure, object position
Method 2 (normal axis) figure, object position
plot, scatter 등 일반적인 graphic
plot, scatter 등 일반적인 graphic
현재 Method를 따름 ginput, drawline ginput

Indexing

모든 경우에서 indexing을 하는 경우는 일반적인 array의 row, col 방식을 따르기에 가장 단순하다.

예를 들어 가장 최상단 좌측 픽셀을 검은색으로 만들고 싶으면 Matlab과 Python 각각 아래와 같이 입력하면 된다.

img(1,1,:) = 0 % Matlab
img[0,0,:] = 0 # Python

Position Input

Matlab과 Python 모두 axis 상에서 마우스로 위치를 찍는 경우는 직관적으로 현재 axis의 상태를 그대로 따라 값을 저장해준다. 예를들어 imshow로 그림을 그려둔 상태에서 ginput을 실행하면 reversed Y axis 상태로 값을 기록한다. 반대로 plot 함수로 일반적인 cartesian 좌표계 상태라면 ginput 함수는 normal axis 상태로 값을 기록한다. 그러나 둘다 x, y 기준이지 row,col 기준이 아님을 기억하자.

 

Object Position(중요)

같은 기능에 대해서 여기서 Matlab과 Python, 그리고 다른 프로그램의 행동이 나뉘는 것 같다.

Python은 FigureManager의 geometry 속성 조절을 통해 window의 위치를 조정할 때 여타 image 처리에 사용되는 axis와 똑같이 reversed Y axis의 Method 1번 방식을 사용하는 반면, Matlab의 경우 Method 2 방식으로 figure window 의 position을 설정할 때 좌측 하단 구석이 원점이 된다.

 

GUI 개발을 할 때도 똑같은 형식으로 작동을 하는데, Matlab의 appdesigner를 사용하거나 ui가 붙는 object(button 등)를 만드는 경우 좌측 하단이 원점이 되는 Method 2 방식을 쓴다. Python으로는 GUI 개발을 해보지 않아서 확실히는 모르나 급히 PyQt5 관련 문서를 찾아보니 좌측 상단이 원점이 되는 Method 1 방식을 쓰는 것으로 보아 두 프로그램 모두  window position을 표기하는 방식과 동일하게 가는 것 같다.

 

Matlab(좌측)과 Python(우측)에서 1,1 위치에 Button object를 만든 경우

결론

결론적으로 이미지 데이터 입/출력은 무조건 Method 1 방법, Position과 관련된 경우는 사용 언어에 따라 체크를 하고 넘어가는 식으로 규칙을 생각해두는 것이 좋다. 위치 데이터를 저장할 때는 나중에 저장한 위치를 다시 표시할 것을 대비해서 Method 1의 방법으로 저장하는 것이 가장 편하지만 저장한 위치로 image array를 자르거나 하는 복잡한 작업을 할 때 일이 더 복잡해질 수 있다. 본인은 그래서 무조건 데이터 저장은 row, col 기준으로 저장을 하고 필요한 경우에만 x,y로 입출력을 하려고 한다.

 

나중에 추가할 내용

flipud 한 뒤 set('YDir', 'normal')

Posted by Knowblesse
취미/Programming | 2021. 6. 11. 23:20 | /29

서론

당신이 처음으로 Windows를 쓰던 날들을 기억하는가? 그저 어디를 어떻게 클릭해야 게임이 시작되는지만 알고 있다가 삭제된 파일을 휴지통에서 찾아오는 방법, Alt 키를 누르고 드래그 하면 바로가기가 생긴다는 사실 등을 배우게 되었을 것이다. 더 나아가서 Ctrl+Alt+Del 을 눌러 작업관리자를 불러와 먹통된 프로세스를 강제종료하거나 프록시 설정, 레지스트리 편집, 고정IP 설정 적용 등을 하나 둘 습득하게 된다. 물론 이러한 과정을 학원이나 정규 교육을 통해서 배우는 사람도 있겠지만, 굳이 누가 시키지 않아도 컴퓨터와 함께 살게 되는 요즘에는 인터넷을 뒤지다 새로운 사실을 알게되거나 컴퓨터를 고치다가 자연히 배우게 되는 사실들이 더 많을 것 같다고 생각한다.

 

Ubuntu를 본격적으로 사용하기 시작한 이후 자연히 알고 있던 다양한 OS의 기능들을 새로 배워야 한다는 것이 정말 신선했다. 당장에 현재 프로세스를 확인하고 싶어서 Ctrl+Alt+Del을 눌렀다가 날 로그아웃 시키려고 하질 않나, explorer를 열려고 Win+e 를 누르면 아무 일도 일어나지 않질 않나... 정말 답답하고 짜증나는 순간을 빈번히 '겪으며 언젠가는 이것도 익숙해 지겠거니' 하며 참고 억지로 썼는데 이제는 딱히 불편함을 느끼지 않고 편안히 Ubuntu를 사용하고 있다.

 

한가지 안타까운 것은 특정한 목적 중심(예를 들어 서버 관리)이 아닌 보편적인 사용을 위한 Ubuntu 관련 교재가 부족했으며, 무엇을 모르는지 어디를 어디까지 알아야 하는지를 모르기 때문에 많은 시행착오를 겪었다는 점이다. (210615추가: 그나마 '리눅스 마스터' 자격증 준비 책이 가장 광범위하고 자세히 나와있기는 하다.) 하지만 관련 책이 없는 것을 이해하는 게,  나도 가끔 부모님께 Windows 사용법을 설명할 때 당혹스러운 감정을 자주 느끼기 때문이다. 스스로에게는 너무나 일상적으로 쓰는 기능들이기에 설명 없이 넘어가버리거나 어디를 얼마만큼 깊게 설명해야하는지 고민을 할 때가 자주 생긴다. 하나의 OS는 끝까지 파고들어가면 수천 페이지 책 한권이 나올텐데 이것을 언제 다 설명하랴...

 

이 글은 Ubuntu 새끼 사용자가 시행착오를 통해 배워나가는 과정을 적는 글이다.

 

권한

  • 최상위 권한인 root와 그 이외의 권한이 있다.
  • 윈도우에서 관리자 권한으로 실행하라고 하면 그냥 실행하듯이 쓰는 Ubuntu 환경에서는 무언가 작업을 하다가 "Permission Denied"가 뜨면 sudo 를 앞에 붙이고 실행하면 비밀번호를 입력하고 관리자 권한으로 실행이 가능하다.
  • 단, 다수의 사용자가 쓰는 환경의 경우 할수 있는 작업이 제한될 수 있다.
  • /etc/passwd 파일에 들어가면 해당 시스템 내부의 모든 사용자를 볼 수 있는데 거의 40번째 줄까지는 시스템이 알아서 만들어주는 사용자일 것이고 가장 아래 자신의 이름이 있을 것이다.
  • 사실 이 파일은 이름 : 비밀번호 : 계정 id : 그룹 id : 설명 : 사용하는 shell 의 구조로 되어있다고 해서 '비밀번호!!!' 를 외치며 눈을 밝히고 들어갔으나 x 표시로 되어있다.
  • 실제 비밀번호는 암호화 되어 (아마 hash?) /etc/shadow 안에 보관된다.
  • 권한에는 읽기, 쓰기, 실행하기 3종류가 있으며, chmod 를 통해서 권한 변경이 가능하다.

파일 구조

  • 모든 (심지어 외장하드도) 파일은 최상위 directory인 root에서 파생된다. 그나마 윈도우에서 가장 유사한 개념은 '내 컴퓨터'일까. 약어로는 /로 표현한다.
  • 그리고 대부분의 작업파일이 존재하는 곳은 /home/사용자명 이다. 이 폴더 안에 바탕화면, 음악/사진/문서, 다운로드 등등의 폴더들이 위치한다. 약어로는 ~ 로 표현한다.
  • root 바로 하위에는 정말 다양한 폴더들이 존재하는데 굳이 하나하나 탐색하진 않았고 천천히 필요가 생길때마다 들어가는 것이 좋다.
    • bin : 각종 명령어 함수들이 들어가 있다.
    • dev : 기기에 연결된 저장장치, 입력장치 들이 다 이곳에 있다. 장치관리자?
    • mnt : 마운트 된 저장장치가 위치한다.
    • root : 루트 권한을 얻어야 들어갈 수 있는데 별게 없어보인다.
    • etc : 온갖 설정파일들이 위치한다. root 바로 하위 directory 중에서 가장 자주 들락거린 것 같다.
    • home : 위에서 설명.
    • media : 자동으로 마운트 된 저장장치가 위치한다.
  • 이 이외의 폴더들은 한번도 들어가본 적이 없어서 잘 모르겠다.

파일 탐색 방법

  • 윈도우의 explorer 처럼 기본으로 nautilus(Files) 라는 프로그램이 깔린다. 제법 편리해서 간간히 쓴다.
  • 무엇보다 리눅스는 외부 저장장치, 심지어는 내장 하드를 전부 root 밑에 mount 시켜야 읽기/쓰기가 가능한데 이게 초심자에게는 어렵다. 하지만 nautilus를 사용하면 좌측 bar에 뜨는 아이콘 클릭만으로 저장장치를 /media에 mount 시킬 수 있다.

좌측 Bar에 뜨는 USB 저장 장치

  • 하지만 리눅스의 목적에 맞게 결국 콘솔을 더 자주 사용하게 된다. 콘솔은 Ctrl+Alt+t로 열 수 있다.

콘솔 기본 커멘드

  • 기본으로는 bash라는 쉘이 돌아간다. 이 이외에 zsh, csh, tcsh 등 다양한 것들이 있고 다들 bash를 안 쓰고 다른 shell을 쓰는 것 같은데 이유는 아직 모르겠다. 더 좋겠지 뭐. 아직은 불편함을 못느껴서 그대로 사용중이다.
  • 도움말 보기 : man 모르는커맨드 를 입력하거나 모르는커맨드 -h 혹은 모르는커맨드 --help 를 입력하면 대체로 알려준다.
  • cd : change directory : 뒤에 경로를 입력해서 현재 위치를 바꾼다
  • ls : list files : 현재 위치에서의 파일들을 출력한다. 주로 -alF 옵션을 함께사용하며 대체로 ll 이라는 alias로 등록이 되어있다.
  • mv, rm, cp : move, remove, copy
  • | 표기 : 가끔 출력된 내용이 너무 많은 경우 콘솔 창 위로 쭉 올라가 버리는 경우가 있다. 이를 천천히 볼 수 있도록 할 때 출력결과를 다른 프로그램에 feed 해줄 수 있는데 이때 이 | 표기를 사용하며 pipe 라고 한다.
    • | more 혹은  | less : 출력결과를 보기 편하게 해준다.
    • | grep 검색어 : 출력결과에서 검색어가 있는 행만 보여준다.
    • 예) ll | grep *.txt : 현재 위치에서 파일리스트를 출력하고 이중 .txt 확장자를 가진 애들만 출력.
  • > 표기 : 출력된 내용을 뒤의 파일에 저장(overwrite) : ls > result.txt
  • >> 표기 : 출력된 내용을 뒤의 파일에 저장(append) : ls >> result.txt
  • < 표기 : 뒤의 파일의 내용을 불러와 커맨드 실행 : sort < filelist.txt
  • 프로세스
    • ps : 현재 프로세스를 확인
    • kill : 프로세스를 강제 종료. -9 옵션을 주면 무조건 종료된다고 함.
    • fg 숫자 : 숫자로 표시된 프로세스를 foreground로.
    • Ctrl+z : 프로세스 일시중지
    • bg : 프로세스를 backgroud로.
    • 커맨드 마지막에  &를 붙이기 : 해당 커맨드를 background로 실행
    • jobs : background에서 돌아가는 프로세스를 확인

자주는 안썼지만 써본 콘솔 커멘드

  • lsblk : list block devices : 연결된 저장장치 확인이 가능
  • df : disk space usage report
  • mount : lsblk를 사용해서 연결된 저장장치를 확인하고 (예: /sdb1) 이를 원하는 경로에 mount 가능
    • sudo mkdir /media/사용자명/mydrive
    • sudo mount /dev/sdb1 /media/사용자명/mydrive
  • lsof : list open files : 출력량이 상당히 많음....
  • lsmod : list modules
    • rmmod : remove module

/etc 내부의 파일/폴더

  • apt : 패키지 관리 프로그램
  • cron : 특정 시간에 특정 작업을 할 수 있도록 해주는 프로그램이라고 함. 예약된 작업?
  • ca-certificate : 각종 인증서(?)
  • fstab : 자동 mounting 프로그램
  • fonts
  • wpa_supplicant : wifi 정보 관련

 

Posted by Knowblesse