파이썬과 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 문자의 유니 코드로 해 보는 것도 재미있을지도 모릅니다.
참고문헌
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)
그렇다고 해서, 단 12행의 코드로 실현되어 버렸습니다.
이번에 처음으로 OpenCV를 건드렸습니다만, 이렇게 편리하다고는 생각하지 않았습니다.
이것과 같은 것을 256 문자의 유니 코드로 해 보는 것도 재미있을지도 모릅니다.
참고문헌
Reference
이 문제에 관하여(파이썬과 OpenCV에서 이미지를 아스키 아트화하는 프로그램을 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Pavaux/items/450ac6823e86b092cfbb텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)