본문 바로가기

IT/AI

[이미지] 번호판 생성 [Python] - cv2, PIL

728x90

2006년 이전쯤 기준 차량 번호판 생성

기본 녹색 배경

도시와 문자 숫자를 랜덤으로 선택

높이, 너비 정보를 구하고 정보를 넣을 좌표 구하기

PIL 이미지로 문자를 이미지에 넣기

    # 문자를 이미지에 넣기 위해 PIL 파일로 변환 과정 필요
    # Image.fromarray()에 변경할 이미지를 입력
    # 문자를 삽입하기 위해 ImageDraw.Draw()에 PIL 이미지로 변환된 파일을 입력
    # draw.text()에 시작 좌표(가로, 세로), 문자, 색상, 폰트.. 등등을 입력
    
    final_img = Image.fromarray(org_img)
    draw = ImageDraw.Draw(final_img)
    draw.text((450, 150), upper_str, (255,255,255), font=font_u)

 

번호판 10개 랜덤 생성

import cv2
import random
import numpy as np
import matplotlib.pyplot as plt
from PIL import ImageFont, ImageDraw, Image

# 이미지 불러오기 > 가장자리 부분 잘라내고, RGB로 변경
org_img = cv2.imread("plate_green.png")[400:1300, 800:2500, ::]
org_img = cv2.cvtColor(org_img, cv2.COLOR_BGR2RGB)

# 폰트 불러오기
font_u = ImageFont.truetype("NanumGothic.ttf", 200)
font_s = ImageFont.truetype("NanumGothic.ttf", 250)
font_n = ImageFont.truetype("NanumGothic.ttf", 300)

# 높이, 너비 확인 (시각화)
print(org_img.shape[:2])
# plt.imshow(org_img)
# plt.show()

plt.figure(figsize=(8,16))

# 도시와 문자 리스트
city_list = ["서울","경기","전북","전남","경북","경남","대전","충북","충남","대구","부산","강원","울산","인천","광주","제주","세종"]
str_list = ['가', '거', '고', '구', '나', '너', '노', '누', '다', '더', '도', '두', '라', '러', '로', '루', '마', '머', '모', '무', '바', '배', '버', '보', '부', '사', '서', '소', '수', '아', '어', '오', '우', '육', '자', '저', '조', '주', '하', '허', '호']

license_plates = []

for i in range(10):  # 10회 진행
    
    # 도시와 문자 랜덤 선택
    city = random.choice(city_list)
    string = random.choice(str_list)
    
    city_num = str(random.randint(1,99))
    
    # 숫자 랜덤 생성(0부터 9999까지) < 1000~9999로 하면 zfill 안해도 됨
    # 1~3자리수는 왼쪽에 0을 채워서 4자리수로 만듦(오른쪽 정렬)
    car_num = random.randint(1,9999)
    car_num = str(car_num).zfill(4)
    
    # 도시, 숫자를 띄어쓰기로 이어 하나의 문자로 만들기 (출력)
    upper_str = "  ".join([city, city_num])
    
    # 문자를 이미지에 넣기 위해 PIL 파일로 변환 후 차량 번호 집어 넣기
    final_img = Image.fromarray(org_img)
    draw = ImageDraw.Draw(final_img)
    draw.text((450, 150), upper_str, (255,255,255), font=font_u)
    draw.text((300, 410), string, (255,255,255), font=font_s)
    draw.text((650, 410), car_num, (255,255,255), font=font_n)
    
    # 출력 준비
    plt.subplot(5,2,i+1)
    plt.imshow(final_img)
    plt.title(f"License Plate_{i+1}")
    
    license_plates.append(final_img)
    
plt.show()

 

위 과정에서 번호판 기울이기 과정 추가

# 변환을 위한 행렬 생성
# cv2.getPerspectiveTransform()에 원본 좌표와 옮기고 싶은 좌표의 정보를 np.float32 나 64 자료형으로 
# 왼쪽 위, 왼쪽 아래, 오른쪽 위, 오른족 아래 순서대로 각각 입력

# 이미지 변환
# 이 과정에서 이미지가 텍스트를 추가 받기 위해 PIL 이미지로 변환 되었습니다.
# cv2.warpPerspective()로 변환을 진행하기 위해서 넘파이 배열로 바꿔주어야 합니다.
# 이미지, 변환 행렬, (가로, 세로 길이)를 인자로 입력

M = cv2.getPerspectiveTransform(org_co, warpped_co)
final_img = cv2.warpPerspective(np.array(plate_img), M, (w, h))

 

import cv2
import random
import numpy as np
import matplotlib.pyplot as plt
from PIL import ImageFont, ImageDraw, Image

# 이미지 불러오기 > 가장자리 부분 잘라내고, RGB로 변경
org_img = cv2.imread("plate_green.png")[300:1400, 700:2600, ::]
org_img = cv2.cvtColor(org_img, cv2.COLOR_BGR2RGB)

# 폰트 불러오기
font_u = ImageFont.truetype("NanumGothic.ttf", 200)
font_s = ImageFont.truetype("NanumGothic.ttf", 250)
font_n = ImageFont.truetype("NanumGothic.ttf", 300)

# 높이, 너비 확인
h, w = org_img.shape[:2]
org_co = np.float32([[0,0], [0,h], [w,0], [w,h]])


plt.figure(figsize=(8,16))

# 도시와 문자 리스트
city_list = ["서울","경기","전북","전남","경북","경남","대전","충북","충남","대구","부산","강원","울산","인천","광주","제주","세종"]
str_list = ['가', '거', '고', '구', '나', '너', '노', '누', '다', '더', '도', '두', '라', '러', '로', '루', '마', '머', '모', '무', '바', '배', '버', '보', '부', '사', '서', '소', '수', '아', '어', '오', '우', '육', '자', '저', '조', '주', '하', '허', '호']

license_plates = []

for i in range(10):  # 10회 진행
    
    # 도시와 문자 랜덤 선택
    city = random.choice(city_list)
    string = random.choice(str_list)
    
    city_num = str(random.randint(1,99))
    
    # 숫자 랜덤 생성(0부터 9999까지) < 1000~9999로 하면 zfill 안해도 됨
    # 1~3자리수는 왼쪽에 0을 채워서 4자리수로 만듦(오른쪽 정렬)
    car_num = random.randint(1,9999)
    car_num = str(car_num).zfill(4)
    
    # 도시, 숫자를 띄어쓰기로 이어 하나의 문자로 만들기 (출력)
    upper_str = "  ".join([city, city_num])
        
    # 문자를 이미지에 넣기 위해 PIL 파일로 변환 후 차량 번호 집어 넣기
    plate_img = Image.fromarray(org_img)
    draw = ImageDraw.Draw(plate_img)
    draw.text((550, 250), upper_str, (255,255,255), font=font_u)
    draw.text((410, 510), string, (255,255,255), font=font_s)
    draw.text((750, 510), car_num, (255,255,255), font=font_n)
    
    # 아핀 변환을 위한 행렬 생성
    dx1, dy1 = random.randint(0, w//2), random.randint(0, h//2)
    dx2, dy2 = random.randint(0, w//2), random.randint(0, h//2)
    dx3, dy3 = random.randint(0, w//2), random.randint(0, h//2)
    dx4, dy4 = random.randint(0, w//2), random.randint(0, h//2)
    warpped_co = np.float32([[dx1, dy1], 
                             [dx2, h-dy2],
                             [w-dx3, dy3], 
                             [w-dx4, h-dy4]])
    M = cv2.getPerspectiveTransform(org_co, warpped_co)

    # 아핀 변환 (PIL 이미지를 넘파이 배열로 변경 후 진행)
    final_img = cv2.warpPerspective(np.array(plate_img), M, (w, h))
    
    # 출력 준비
    plt.subplot(5,2,i+1)
    plt.imshow(final_img)
    plt.title(f"License Plate_{i+1}")
    
    license_plates.append(final_img)
    
plt.show()