파이썬과 OpenCV에서 이미지를 아스키 아트화하는 프로그램을 만들었습니다.

소개



요 전날 ASCII 카메라이라는 재미있는 사이트를 찾았습니다.

이런 식으로 브라우저에서 카메라 영상을 가져와 ASCII 문자열로 변환합니다.

이 정도라면 혹시 스스로 만들 수 있지 않을까 생각했기 때문에, 이미지를 아스키 아트로 변환하는 프로그램을 만들어 보기로 했습니다.

메커니즘



구조로는 다음과 같습니다.
  • 이미지를 회색조로 변환
  • 각 픽셀의 색 농도를 얻고 그에 따라 문자를 결정합니다
  • 열당 개행

  • Python과 OpenCV를 사용하면 이러한 작업을 매우 쉽게 수행 할 수 있습니다.

    그레이 스케일로 변환



    읽어들이는 이미지의 패스는 input로 취득하도록(듯이) 합니다.
    그레이 스케일로 변환되고, 그레이에는 각 픽셀의 농도(0~255)가 저장됩니다.
    import cv2
    
    imgpath = input("Path: ")
    img = cv2.imread(imgpath)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    

    ASCII 문자 결정



    각 픽셀의 농도(0~255)마다 ASCII 문자를 결정할 필요가 있습니다만, 실제로 사용할 수 있는 ASCII 문자는 256개도 없습니다.
    어쩔 수 없기 때문에, 사용하는 문자를 64개에 엄선해, 농도를 4 마다 구분해 문자를 선택하기로 했습니다.
    예를 들어 농도가 0~3이라면 「M」, 252~255라면 「(공백)」라고 하는 상태입니다.

    이하가 「농도가 높은」 차례로 늘어놓은 64개의 문자입니다.
    MWN$@%#&B89EGA6mK5HRkbYT43V0JL7gpaseyxznocv?jIftr1li*=-~^`':;,. 

    이 순서를 결정하는 것이 꽤 힘들었습니다.
    순서는 외형으로 결정했을 뿐이므로, 매우 적당합니다.

    변환 처리는 이런 느낌이 되었습니다.
    
    colorset = "MWN$@%#&B89EGA6mK5HRkbYT43V0JL7gpaseyxznocv?jIftr1li*=-~^`':;,. "
    
    for gray2 in gray:
        output += "\n"
        for dark in gray2:
            output += colorset[dark // 4] * 2
    

    농도를 4로 나누고 잘라내면 colorset 인덱스를 얻을 수 있습니다.
    ASCII 문자의 종횡비는 2:1이므로, 쓸 문자를 2배로 하고 있습니다.

    완성



    완성된 프로그램은 이런 느낌입니다.
    결과는 파일에 출력하는 형식으로 했습니다.
    import cv2
    
    colorset = "MWN$@%#&B89EGA6mK5HRkbYT43V0JL7gpaseyxznocv?jIftr1li*=-~^`':;,. "
    
    imgpath = input("Path:")
    img = cv2.imread(imgpath)
    
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    output = ""
    
    for gray2 in gray:
        output += "\n"
        for dark in gray2:
            output += colorset[dark // 4] * 2
    
    with open("output.txt", mode="w") as f:
        f.write(output)
    

    시험에 내 아이콘(이쪽↓)을 변환해 보겠습니다.

    결과는 ...



    이런 느낌.
    의외로 제대로 변환되어 놀랐습니다.

    다음에, 파쿠타소님으로부터 받은 영국 북부의 자연 풍경의 프리 화상을, 300×200px로 변환한 것으로 시험해 보겠습니다.

    결과는 ...


    그래 ... 글쎄, 좋은 선이라고 말하지 않니?

    마지막으로, This person does not exist 라는 AI가 얼굴 사진을 자동 생성해주는 사이트에서 입수한,

    이 이미지를 250x250px로 변환하여 실행해 봅니다.

    결과는 ...


    꽤 좋은 느낌이네요!
    이게 좋다... 최선을 다했던 보람이 있었다...

    결론



    그렇다고 해서, 단 12행의 코드로 실현되어 버렸습니다.
    이번에 처음으로 OpenCV를 건드렸습니다만, 이렇게 편리하다고는 생각하지 않았습니다.
    이것과 같은 것을 256 문자의 유니 코드로 해 보는 것도 재미있을지도 모릅니다.

    참고문헌


  • Python, OpenCV, NumPy로 컬러 이미지를 흑백 (그레이 스케일)으로 변환
  • Python, NumPy로 이미지 처리 (로드, 연산, 저장)
  • 좋은 웹페이지 즐겨찾기