반응형
opencv2를 활용하여 이미지에서 특정색만 추출하는 3가지 방법입니다.
추출할 이미지 )
코드 )
위 원본 이미지에서 빨간색(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])
반응형
'이미지 처리' 카테고리의 다른 글
[opencv] 이미지 히스토그램 구하기 (0) | 2023.08.15 |
---|