이미지 처리

[opencv]cv2 이미지 특정 색만 추출하는 방법 정리

감자156 2023. 4. 29. 23:40
반응형

opencv2를 활용하여 이미지에서 특정색만 추출하는 3가지 방법입니다.

추출할 이미지 )

 

opencv_logo.png

 

코드 )

위 원본 이미지에서 빨간색(r:255, g:1, b:1)값을 추출하는 예시 3가지.

* opencv2는 imread시 이미지를 bgr 꼴로 불러오기 때문에, 색상값 지정도 bgr순으로 해줘야 함

 

방법 1 : opencv2의 inRange 함수

색상 상한, 하한을 지정하여 범위로 색상값을 추출할 수 있음.

# 방법 1) opencv2의 inRange 함수 사용
import cv2 
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('./opencv_logo.png') 

lower_red = np.array([1, 1, 255])
upper_red= np.array([1, 1, 255])

mask = cv2.inRange(img, lower_red, upper_red)
img = cv2.bitwise_and(img, img, mask =  mask) 

plt.imshow(img[:,:,::-1])

 

 

방법 2 : np.where 함수 사용하여 한 번에 색상 변경

특정 rgb값에 해당하는 모든 픽셀을 한번에 변경할 수 있음

 

# 방법 2) np.where 사용하여 특정색상 변경
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('./opencv_logo.png')

pos = np.where((img[:,:,0] == 1) & (img[:,:,1] == 1) & (img[:,:,2] == 255))
for h, w in zip(pos[0], pos[1]):
    img[h][w] = [255,255,255]

plt.imshow(img[:,:,::-1])

 

 

방법 3 : 수동으로 추출하기

2중 for문으로 이미지 픽셀 하나하나 검사하며 특정값 제외하고 masking

 

# 방법 3) 수동으로 하나하나 masking
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread('./opencv_logo.png')

height, width, channel = img.shape

for i in range(height):
    for j in range(width):
        if not(all(img[i][j] == [1, 1, 255])):
            img[i][j] = [0, 0, 0]

plt.imshow(img[:,:,::-1])

 

반응형