Home » Development

Development

프로그래밍 언어 및 환경

점자 텍스트로 이미지 표현하기

지난 글에서 이미지를 아스키문자로 렌더링하는 방법에 대해서 알아보았는데, 이번에는 조금 다른 이미지 렌더링 방식에 대해서 알아보자. 인터넷에서 돌아다니는 다음과 같은 아스키아트를 본 적이 있을지 모르겠다. 기존의 아스키아트는 글자 1개가 픽셀 1개를 표현하는데, 이런 종류의 아스키 아트는 1글자가 픽셀 8개를 표현한다. 2×4의 점으로 한 글자가 이루어지는 이 문자들은 유니코드 점자 문자 세트의 글자들이다. 각각의 점이 on/off 상태로 총 128개의 문자를 표현할 수 있기 때문에 실질적으로 모든 픽셀을 표현하는 것이 가능하다. 점자 코드의 첫글자는 0x2800로 빈 칸을 표현하며, 이후 아래방향으로 그리고 다시… 더 보기 »점자 텍스트로 이미지 표현하기

이미지를 아스키코드로 렌더링하기

인터넷에 보면 꽤나 유명한 사진 이미지를 아스키문자로 표현해놓은 것들을 종종 볼 수 있다. 선이나 슬래시 문자를 사용해서 그림처럼 그리는 것들은 아마도 장인정신을 발휘하여 한 땀 한 땀 수놓은 것들이겠지만, 그렇지 않고 문자와 문장 부호들만으로 멀리서 보면 그림처럼 보이게 표현해놓은 예들이 무척 많다. 이런 아스키 아트들은 사실 약간의 아이디어만 있으면 간단히 만들 수 있는데, 오늘은 아스키 코드로 이미지를 렌더링하는 방법에 대해서 알아보자. 이미지 처리를 위해서는 간단히 PIL 정도의 라이브러리만 있으면 된다.

더 보기 »이미지를 아스키코드로 렌더링하기

OpenCV를 사용하여 두 이미지의 다른 부분 찾기

두 이미지의 구조적 유사성을 분석하는 알고리듬으로 SSIM (Structural Similarity)가 있는데, 이를 사용하면 두 이미지가 어느 정도로 유사한지, 어느 부위가 다른지를 알아낼 수 있다. ssim을 수행하는 함수는 scikit-image 라이브러리가 제공하고 있으니, 이를 사용해서 두 이미지의 다른 부분을 찾는 작업을 수행할 수 있다. 다만 이미지를 비교하기 위해 필요한 전처리와 이미지 차이를 구분한 이후의 처리를 위해서는 opencv의 사용이 필수불가결하다. https://docs.opencv.org/master/modules.html 에서 각 모듈에 대한 정의와 Python API를 볼 수 있다. 필요한 라이브러리 설치 몇 가지 라이브러리가 필요하다. 먼저 opencv-python을 설치해서 OpenCV를 사용할 수… 더 보기 »OpenCV를 사용하여 두 이미지의 다른 부분 찾기

순열과 조합 – itertools (python)

알려져 있는 원소들로 구성되는 가능한 모드 조합 및 순열을 구하려 할 때, 이를 직접 구현해보는 것도 좋지만 itertools 모듈에 있는 함수를 사용하는 것을 추천한다. 이 함수들은 기본적으로 제너레이터 함수이기 때문에 한번에 리스트 등으로 만들기 전까지는 메모리에 큰 부담을 주지 않으며 성능도 적절한 편이다. 오늘은 itertools의 함수 중에서 순열과 조합에 관련된 함수들을 알아보도록 하자.

더 보기 »순열과 조합 – itertools (python)

파이썬 패턴매칭

파이썬 3.10에서는 구조적 패턴 매칭이라는 새로운 문법이 도입된다. 패턴매칭은 match 문이라는 새로운 구문에 적용된며, 스칼라 같은 다른 언어들에서 영향을 받았다고 한다. match 문은 어떤 값(subject)을 여러 다른 형태(pattern)들과 들어맞을 때 까지 비교한다. 이는 C와 같은 언어의 switch 문과 같은 것이 아니냐고 할 수 있겠지만, switch 문이 여러 케이스의 값을 비교하는 것과 달리, match 문은 값에 대해서 패턴에 들어맞는지를 보는 것이 차이라 하겠다.

더 보기 »파이썬 패턴매칭

ASCIIMATICS 101 – 2

지난 글에서 ASCIIMATICS로 기본적인 애니메이션 효과를 구현하는 방법에 대해 살펴보았다. 이번에는 텍스트 기반 UI를 구성하는 방법에 대해 다뤄보려고 한다. 텍스트 기반 UI는 여느 GUI와 마찬가지로 기본적인 UI 컴포넌트인 위젯을 조합하는 형태로 만들어진다. 대신에 일반적인 애니메이션 재생과 달리 이러한 위젯들은 사용자와의 상호작용을 전제로 디자인되어 있으며, 화면 뒤에 존재하는 데이터를 표시하고 변경하는 동작을 수반한다.

더 보기 »ASCIIMATICS 101 – 2

ASCIIMATIC 101

파이썬으로 가장 GUI를 구현하는 방법으로는 여러 가지가 있다. 기본으로 내장된 Tkinter 도 있고, wxPython 이나 pyQt 같은 것까지. 개인적으로 매우 간단한 UI를 갖춘 프로그램을 작성하려고 했지만 이래 저래 복잡해서 뭐 좀 없을까 하고 하다가 asciimatics를 알게되었다. asciimatics는 기본적으로 아스키문자를 사용해서 콘솔 화면에 애니메이션을 구현하는 라이브러리인데, 이 중에서 입출력과 관련된 기능도 있고, 간단한 TUI를 구현하는 기능 역시 존재한다. 이를 사용하면 간단한 폼이나 대화상자 등을 시각적으로 구현할 수 있고, 그외 이것 저것 재미난 것들을 화면에 구현해볼 수 있다. (이미지를 텍스트로 변환해서 표시한다던지…)… 더 보기 »ASCIIMATIC 101

Pillow 기본 사용법

PIL은 (아마 짐작이 가능하겠지만) Python Imaging Library의 약자로, 파이썬에서 여러 포맷의 이미지를 읽고 조작할 수 있게 하는 라이브러리이다. GUI 관련 라이브러리/프레임워크들이 일부 이미지 조작과 관련한 기능을 제공하긴 했지만, 2000년대 초반에 ‘파이썬스럽게’ 이미지를 처리할 수 있고, 가장 많은 기능을 사용할 수 있었다. 그러나 행복한 나날은 오래가지 못했는데, 2009년쯤해서 PIL은 더이상 새 버전이 릴리즈 되지 않았다.

더 보기 »Pillow 기본 사용법

prompt toolkit을 사용하는 비동기 입력 프롬프트

prompt_toolkit은 asyncio를 지원하는 prompt_async()를 제공한다. input() 함수나 보통의 prompt() 함수는 입력을 받는 중에는 스레드 전체를 블럭하기 때문에 다른 동작이 모두 멈추게 된다. prompt_async()는 이러한 문제를 해결할 수 있는 대안이다. 참고로 patch_stdout()을 사용하면 입력을 기다리는 중에 다른 코루틴이 출력을 할 수 있게 하면서, 입력 중간에 출력되는 내용 때문에 입력 프롬프트가 망가지는 것을 방지할 수 있다. (단 코루틴에서 print()를 통해 출력한 경우만 제대로 작동하는 것 같고, print_formatted_text()를 쓰면 좀 꼬이는 거 같긴 하다…) 위 코드에서 task1은 1초마다 화면에 문구를 반복해서 출력한다. task2에서는… 더 보기 »prompt toolkit을 사용하는 비동기 입력 프롬프트