이것저것 기록

[python, openCV] 이미지 파일에서 특정 픽셀값만 추출하기 본문

코린이/실무를 위한 코딩 기록

[python, openCV] 이미지 파일에서 특정 픽셀값만 추출하기

anweh 2020. 9. 21. 20:52

영상처리를 하다보면 여러 색이 뒤죽박죽 섞인 이미지에서 특정 색만 추출하고 싶을 때가 있다. 

 

 

 

예를 들어 다음과 같은 사진이 있다고 생각해보자. 

서울시 인구밀도 지도, 2005

여기서 60,000이상 되는 지역만 뽑아내고 싶다면 어떻게 해야할까? 

 

 

 

우선 그림판에 해당 이미지 파일을 연다. 

이건 진짜 꿀팁인데, 이미지에서 특정 픽셀의 색상값을 알고 싶을 때 그림판처럼 빠르고 쉬운 툴이 없다. 

그림판 열기

빨간색 동그라미는 '색 선택' 툴이다. (과학시간에 한번쯤 써봤을 스포이드 모양) 

이 툴을 클릭한 후 내가 뽑고 싶은 색상값의 픽셀을 여드름 짜듯이 찍어준다. 고도의 정밀도를 요구로 하는 작업은 아니니까 대충 찍어주면 된다. 

찍었으면, 오른쪽 초록색의 색편집 툴을 클릭한다. 

 

색 편집

우측 하단의 빨강, 녹색, 파랑에 해당하는 값이 바로 이 픽셀의 색상값이다. so easy.... 

아무튼 이 색상값을 잘 기억하고 본격적인 코딩으로 넘어가자. 

 


 

일단 제일 먼저 필요한 라이브러리부터 import 하자. 

import os
import cv2
import numpy as np

 

 

몇 줄 안되는 코드니까 바로 시작하겠음. 

os.chdir('폴더 경로')
img = cv2.imread('seoul.jpg') #파일명

canvas = np.zeros(shape=img.shape, dtype=np.uint8)
canvas.fill(255)
canvas[np.where((img == [1,0,164]).all(axis = 2))] = [255,0,0]

cv2.imwrite('_seoul.png', canvas)

진짜 별 거 없다.

불러온 이미지 크기와 동일한 빈 캔버스를 만들어주고 (canvas = np.zeros()) 흰색으로 채워준다.

나는 검정색으로 채워줬다. 

해당 이미지의 특정 색상값 ([1,0,164])과 동일한 좌표에 내가 원하는 색상값([255,0,0])을 넣어주면 끝이다. 

 

 

 

고밀도 지역 추출

짠. 

정말 별 거 없는 코드인데, 한창 코딩 처음 시작했을 때는 이런 것도 몰라서 헤맸었다... 

아 그리고 레스터 이미지에서 특정 색상값을 추출할 때는 주의할 점이 있다. 

 

 

색상이 바뀌는 경계선

바로 색상값이 바뀌는 변경구간이다. 

예를 들어 빨강 >> 회색 으로 바뀌는 구간을 확대해 보면 경계 부분의 색상값은 빨강도, 회색도 아닌 이상한 놈들이 있다. 

이런 구간이 있기 때문에 보통 이진화를 수행한 뒤에 색상값 분리를 수행하곤 한다.

뭐 이런 이슈 사항이 있을 수 있다~ 정도로 염두에 두는 걸로! 

 

 

 

 

Comments