고전적 방식의 차선인식
코드를 보시기 전 이전 글에서 설명을 보고 오시는 걸 추천드립니다.
https://icebear-code.tistory.com/21?category=1001602
Python을 이용한 고전적 방식의 차선인식1_색상추출
고전적 방식의 차선인식 1. 모듈 불러오기 차선 인식을 위해 Python & OpenCV 환경을 이용하였고 필요한 함수나 전역변수 등이 포함된 파일을 불러온다. OpenCV모듈과 Python의 내장 함수 중 수학 함수
icebear-code.tistory.com
1. 모듈 불러오기
from google.colab.patches import cv2_imshow
import cv2
import math
import numpy as np
from time import sleep
import matplotlib.pyplot as plt
Colab환경에서 차선 인식을 위해 Python & OpenCV 환경을 이용하였고 필요한 함수나 전역변수 등이 포함된 파일을 불러온다. OpenCV모듈과 Python의 내장 함수 중 수학 함수인 math 모듈 그리고 행렬 처리를 위한 numpy를 불러온다. 모듈 이름이 너무 길거나 보기 불편할 때 as Name과 같이 사용하시면 긴 이름 대신 Name에 정의한 이름을 모듈 이름 대신 사용할 수 있다.
2. 영상 불러오기
frame=cv2.imread('~/road.jpeg')
#사용할 이미지 경로
frame = cv2.resize(frame, dsize=(1280, 720))

cv2.imread() 함수를 이용하여 이미지 파일을 읽는다. 이미지 파일의 경로는 절대/상대경로가 가능하다. cv2.imread(fileName, flag) 함수는 flag를 이용하여 파일을 읽을 때의 옵션을 설정해줄 수 있다. flag는 3가지가 있다.
Flag
1.cv2.IMREAD_COLOR : 이미지 파일을 Color로 읽음.
2.cv2.IMREAD_GRAYSCALE : 이미지를 Grayscale로 읽음.
3.cv2.IMREAD_UNCHANGED : 이미지파일을 alpha channel까지 포함하여 읽음.
* 3개의 flag대신에 1, 0, -1을 사용해도 된다.
3. 노이즈 제거
img_Gauss = cv2.GaussianBlur(frame, (5, 5), 0)
# 블러링 기법 적용

이미지 Blurring은 고주파 영역을 제거함으로써 노이즈를 제거하거나 경계선을 흐리게 할 수 있다. OpenCV는 네 가지 형태의 blurring 방법을 제공한다. 그중 하나인 Gaussian Filtering을 사용했다. Gaussian Filter는 kernel 행렬의 값을 Gaussian 함수를 통해서 수학적으로 생성하여 적용한다. 이미지의 전체적으로 밀도가 동일한 노이즈, 백색노이즈를 제거하는 데 가장 효과적이다.
cv2.GaussianBlur(img, ksize, sigmaX)
img : Chennel수는 상관없으나, Data Type은 CV_8U, CV_16U, CV_16S, CV_32F or CV_64F인 이미지를 입력
ksize : (width, height) 형태의 kernel size.
sigmaX : Gaussian kernel standard deviation in X direction.
4. 색상추출
hls = cv2.cvtColor(img_Gauss, cv2.COLOR_BGR2HLS)

색공간을 RGB공간에서 HSL 색공간으로 변환한다.
cv2.cvtColor(src, code)
src: 변환할 이미지
code: 변화 코드
white_lower = np.array([np.round(0 / 2), np.round(0.75 * 255), np.round(0.00 * 255)])
white_upper = np.array([np.round(360 / 2), np.round(1.00 * 255), np.round(0.30 * 255)])
white_mask = cv2.inRange(hls, white_lower, white_upper)
yellow_lower = np.array([np.round(40 / 2), np.round(0.00 * 255), np.round(0.35 * 255)])
yellow_upper = np.array([np.round(60 / 2), np.round(1.00 * 255), np.round(1.00 * 255)])
yellow_mask = cv2.inRange(hls, yellow_lower, yellow_upper)
mask = cv2.bitwise_or(yellow_mask, white_mask)
masked_color = cv2.bitwise_and(hls, hls, mask=mask)
#노란색 하얀색 색깔 추출
masked_color = cv2.cvtColor(masked_color, cv2.COLOR_HLS2BGR)
masked_color = cv2.cvtColor(masked_color, cv2.COLOR_RGB2GRAY)
#색공간 변환
print('masked_color')
cv2_imshow(masked_color)

색상 추출의 과정은 HSL 값의 최대, 최소를 정해주고 차선의 흰색 부분과 노란색 부분을 각각 따로 추출하여 따로 인식한 영상을 mask 변수를 이용하여 하나의 영상에 합쳐주었다. 원하는 색깔을 추출 후 향후 이미지 처리를 위해 영상을 Grayscale로 변환해 주었다.
cv2.inRange (src, lowerb, upperb, dst)
src: 입력 영상.
lowerb: 하한 값 행렬 또는 스칼라
upperb: 상한 값 행렬 또는 스칼라
dst: 입력 영상과 같은 크기의 마스크 영상
참고사항.
색공간
OpenCV에서 이미지를 불러오면 기본적으로 BGR 순서의 색공간을 사용하고 있다. 하지만, 이미지 전처리를 하기 위해서는 다양한 색공간을 사용할 필요가 있다. 그중 많이 사용하는 것이 GrayScale, HSV, HSL등 이 있다.

HSV는 Hue, Saturation, Value의 앞글자를 가지온 색공간이며, 기하학적으로 원통으로 표현할 수 있다. Hue는 색상의 종류(빨강, 녹색, 파랑 등), Saturation은 채도로 색상의 선명도, Value는 빛의 밝기를 나타낸다. RGB 색 공간보다는 좀 더 우리들이 색을 판단하는 과정과 유사한 것이 HSV 색 공간이다. 만약 색깔을 통해 이미지에서 어떤 물체를 검출하고 싶다면, RGB 공간보다는 HSV 공간이 적합하다.
HSL은 색상 (Hue), 채도 (Saturation), 명도/휘도 (Lightness/Luminance)이다. 얼핏 보면 HSV와 비슷해보이지만 명도만 변형된 색공간이다. 밝기 (L)와 상관없이 채도 조절이 가능하고 HSV보다 밝기의 폭이 넓어 더 많은 밝기 표현 가능하다. 또한 밝기(L)는 HSV의 채도/명도에 영향을 주기도 하며, 포함한 빛의 양에 대한 측정값으로 휘도 등으로 표현할 수도 있다.
*휘도는 반사되는 빛의 양을 말하며, 쉽게 눈부심의 정도라고 할 수 있다.
블러링 기법
블러링이란 영상을 초점이 맞지 않은 사진처럼 부드럽게 만드는 필터링 기법이다. 이는 영상에 존재하는 잡음의 영향을 제거하는 전처리 과정으로 많이 사용한다. 그 중 위 영상처리에서 사용된 블러링 기법은 가우시안 필터를 사용하는 블러링 기법이다.
'자율주행' 카테고리의 다른 글
[자율주행 차선관련 논문] End-to-end Lane Shape Prediction with Transformers (0) | 2023.03.24 |
---|---|
[자율주행 차선관련 논문] End to End Learning for Self-Driving Cars (0) | 2023.02.20 |
[코딩] Python을 이용한 고전적 방식의 차선인식1_색상추출 (0) | 2023.01.01 |
간단하게 알아보는 자율주행차 인지 센서들 (1) | 2022.12.14 |
현대자동차 H-Mobility Class 후기 (0) | 2022.11.26 |
댓글