독학하는 학생의 정리노트

독학하며 정리노트를 올리는 학생 공부 블로그입니다.

IT 프로그래밍/Python 파이썬

Line 기본 총정리

공부 안 하는 학생 2020. 10. 5. 08:32

길고긴 여정을 끝냈다...라고 안도 할 때쯤 이건 새발의 피 라는걸 동시에 느꼈다.

이거는 정말 base중에 base라는 말을 듣고 그래도 기초는 끝냈다라는 것에 기쁨을 느끼며 마지막 총정리를 하고 프로젝트로 넘어가자

 

이미지를 불러와 gray scale로 변환시킨다. (edge을 찾기 위한 가공처리)

kernal _size 얼마의 픽셀 값으로 블러셔 할 것인지.

가우시안 필터로 gray scale에 사진을 (몇 대 몇(픽셀 값))으로 블러셔 할 것인지. sigma는 0으로 맞춰 노이즈 제거에만 초점을 둔다.

low_threshold = 임계값 1.

- 임계값 1 이하에 포함된 가장자리는 가장자리에서 제외하고

high_threshold = 임계값 2

- 임계값 2 이상에 포함된 가장자리는 가장자리로 간주하고 임계값 2는 임계값 1보다 3배 정도 작아야 한다. (깔끔히 나옴)

즉 80 이하에 가장자리는 가장자리로 포함하지 않고 240 이상에 가장자리는 가장자리로 간주한다. (그 사이는 잔선으로 처리되는 것 같음)

가공 처리된 image인 blur_gray에서 Canny를 사용해 edges 찾는다.

rho = 픽셀 크기

theta = 기울기

np.array는 빈 공간

min_line_length = 이 값 이하로 주어진 선 길이는 찾고자 하는 직선으로 간주하지 않는다.

max_linethmax_line_gap = 찾은 직선이 이 값 이상 떨어져 있으면 다른 직선으로 간주한다.

line_image = np.copy(image)*0 곱하기 0은 RGB로 black을 의미한다.

threshold = 서로 일직선 위에 있는 점의 수가 threshold 개수 이상인지 아닌지를 판단하는 척도와 같은 것이다. 값이 작으면 그만큼 기준이 많아져 많은 직선이 검출될 것이고 , 값을 높게 정하면 그만큼 적지만 확실한 직선들만 검출될 것이다.

2020/10/04 - [IT 프로그래밍/Python 파이썬] - cv2.HoughLinesP(edges,rho,theta,threshold,np.array([]),min_line_length,max_line_gap)

 

cv2.HoughLinesP(edges,rho,theta,threshold,np.array([]),min_line_length,max_line_gap)

서론쓸 힘이 없다. 게임하고 싶은 마음을 뒤로 하고 알고리즘 공부를 해보자 cv2.HoughLInes에서는 image를 쓴다. p는 probabilistic 즉 확률적이라는 말이 포함된 허프변환이다. image = 8bit 즉 1 채널인 흑��

elvic.tistory.com

HoughLinesP는 output에서 선분의 시작점과 끝점에 대한 좌표값을 출력하고 그렇기 때문에 함수 안에서 선의 최소 길이라든지, 점 사이의 최대 간격을 설정해야 하는 것이다.

검은색 사진(line_image)에 HoughLinesP에 라인을 그린다. 빨간색에 굵기 10으로.

따로 지정해 둔 부분이 없는데 왜 저 차선만 선이 그어져있을까. 그건바로 max_line gap ,threshold, min_line_length 때문이다.

threshold로 잔 선들을 후보에서 제외 시키고 min으로 길이 100 이하에 직선들을 제거한다음 max으로 확실한 선을 찾는다

이중에서도 min길이가 핵심인것같다 (이 만큼 긴 선은 차선 하나밖에 없으니)

 

또 다른 궁금증, 왜 굳이 원본 이미지를 copy한 다음 검정색으로 만든 후 그 위에 선을 그릴까 (edges를 이용해서)

그냥 바로 edges위에 그리면 되는것 아닌가? 라는 의문이 들어서 바로 실험해보았다 .

이것도 되긴된다

결과적으론 되긴된다. 하지만 색깔이 gray scale과 blur를 거쳐서 그런지 선 색이 노란색이거 바탕이 약간 푸른빛이 돌고 좀 불투명하다. 그래서 원본 카피를 만든 후 두 이미지를 겹치는것 같다.

dstack = 세 번째 축을 따라 배열을 쌓을 것이다.(?)

이것도 되긴된다

masked_edges 이미지를 line_image와 합치기 위해서 masked_edges를 binary (이진수) 사진으로 변환한다.

line_image는 이미 HoughLinesP 를 통해 array형식으로(일단 array가 있으니)으로 된 것같고 edges는 원본과 다른 사진이기 때문에 dstack을 사용하는 것 같다

line_image는 점으로 되어있다. 이 코드는 무엇을 뜻하나 싶어서 주석 처리하고 실행해봤는데 이 코드 없이도 잘 돌아가던데..?

두 사진은 array로 합쳐지는데 print((type())을 이용하여 각 사진의 타입을 봤더니 array다.

그래서 np.dstack 없이도 잘 돌아가는 것 같다. 좀더 확실하게 하려고 하는건가..?

 

addWeighted로 두 사진을 합친다. color_edges와 line_image를  합친다.

0.8과 1은 각각 그 앞에 있는 image 1과 image 2의 투명도를 조절한다. 맨 뒤에 0은 사진 전체에 투명도를 의미한다.

 

***핵심은 lines 즉 cv2.HoughLinesP와 for line in lines로 edges에서에 선 조절이었던 것 같다***

이제 드디어 project를 들어가는데 설레면서도 두려운 공부 안 하는 학생이였습니다.