이미지에서 색상이 변경되는 곳에 점을 찍어주어 라인을 그려주는 방법입니다.
이미지에는 수십만 가지 색상이 존재합니다. 아무리 간단해 보이는 이미지도 수만 가지 이상은 됩니다.
따라서 색상을 기준으로 라인을 그리기 위해서 우선, 색상 단순화가 먼저 진행되어야 합니다.
색상 단순화 알고리즘은 여기서 확인할 수 있습니다.
링크
라라랜드 포스터를 가지고 실험을 해보겠습니다.
우선, 이미지에서 색상을 단순화시킵니다.
32개의 색상으로 단순화시킨 결과입니다.
이미지가 그림처럼 변환된 모습을 볼 수 있습니다.
그럼 이제 색상 변경 지점을 기준으로 선을 그려보겠습니다.
import cv2
import numpy as np
def drawLine(colorImage):
# 라인 그려줄 캔버스 (input 이미지와 shape 동일)
lineMap = np.zeros(colorImage.shape) + 255
# 가로선(y값) 하나씩 비교
for y, orgRow in enumerate(colorImage[:-1]):
nextRow = colorImage[y+1]
# 색상이 다른 지점 인덱스
compareRow = np.array( np.where((orgRow == nextRow) == False))
# 색상이 다른 모든 x값에 검은색을 칠해줌
for x in np.unique(compareRow[0]):
lineMap[y][x] = np.array([0, 0, 0])
width = lineMap.shape[1]
# 세로선(x값) 하나씩 비교
for x in range(width-1):
# 색상이 다른 지점 인덱스
compareCol = np.array( np.where((colorImage[:,x] == colorImage[:,x+1]) == False))
# 색상이 다른 모든 y값에 검은색을 칠해줌
for y in np.unique(compareCol[0]):
lineMap[y][x] = np.array([0, 0, 0])
# 3차원 numpy array를 2차원 numpy array로 변경 (threshold 이용)
_, lineMap = cv2.threshold(lineMap, 199, 255, cv2.THRESH_BINARY)
return lineMap
색상 변경 지점에 선을 그려주는 drawLine 함수를 만들어보았습니다.
- Input : (색상이 단순화된) 이미지
- Output : 라인 그려진 이미지 (input 이미지와 width, height 동일한 2차원 이미지)
결과는?
이렇게 색상 변경 지점에 선이 그어진 것을 확인할 수 있습니다.
반응형
'Python tech > Computer Vision' 카테고리의 다른 글
[Python CV] 세그멘테이션을 통해 이미지 잘라내고 회전하기 (2) | 2021.08.04 |
---|---|
[Python opencv] K-means 활용, 이미지 색상 개수 줄이기 (3) | 2021.05.16 |
[Python OpenCV] 이미지를 그림화 하기 (색 일반화) (0) | 2021.04.05 |
[camelot] line_scale이란? (opencv로 라인 추출) (0) | 2021.03.09 |
[camelot] read_pdf() 파라미터 (0) | 2021.02.08 |