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()
'IT > AI' 카테고리의 다른 글
인공 신경망 기초 (0) | 2024.03.06 |
---|---|
[이미지] CustomDataset [Python] - cv2, PIL (0) | 2023.09.07 |
[이미지] Numpy로 이미지 처리 기초 [Python]-cv2 (2) | 2023.08.29 |
[이미지] Numpy로 이미지를 224x224 크기로 crop 하기 [Python]-cv2 (0) | 2023.08.29 |