[cv2,python]식물사진 색상추출하여 영역분리

블로그·2022년 11월 20일
0

# 픽셀의 초록계열 색상만을 남기기

대부분의 식물은 초록색을 띄기때문에 이미지에서 식물을 분리하기위해 색상을 추출하는 방법을 사용할 수 있다.

디지털 색체시스템으로는 HSV, RGB, LAB, CMYK 가 있다.
이미지 출처-https://darkpgmr.tistory.com/66


HSV가 초록색인식이 잘되서 HSV로 구분.

데이터는 케글의 https://www.kaggle.com/datasets/vbookshelf/v2-plant-seedlings-dataset 사용.

import cv2
import numpy as np
import matplotlib.pyplot as plt

#green색 mask적용
image_bgr = cv2.imread('imgtest/12.png') # 이미지 로드
image_hsv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2HSV) # BGR에서 HSV로 변환
lower_green = np.array([35,40,0]) # HSV에서 색의 값 범위 정의 
upper_green = np.array([85,255,255]) # hue(색상), saturation(채도), value(명도)
mask = cv2.inRange(image_hsv, lower_green, upper_green) # 마스크를 만듬 

plt.imshow(mask), plt.axis("off") # 이미지 출력
plt.show()



-만들어진 mask-

-적용해서 분리-

image_bgr_masked = cv2.bitwise_and(image_bgr, image_bgr, mask=mask) # 이미지에 마스크를 적용
image_rgb = cv2.cvtColor(image_bgr_masked, cv2.COLOR_BGR2RGB) # BGR에서 RGB로 변환

plt.imshow(image_rgb), plt.axis("off") # 이미지 출력
plt.show()

-결과-


# 노이즈제거

영역을 분할한 뒤 최빈값을 제외한 영역을 0으로 치환하는 방식 사용

from scipy.stats import mode
def noise(mask):
    mask = cv2.connectedComponents(mask)[1] # 그루핑 해서 바뀐 배열값 반환 (배열개수,nbarray)
    mask_1D = mask.reshape(-1,) # 1D로 변환, delet함수 사용하기 위해서
    delet_mask_1D = delet(mask_1D, 0) # 0은 배경이라서 제외
    n = mode(delet_mask_1D, keepdims=True)[0][0] # 최빈값; nbarray로 나와서 [0][0]로 벗겨냄
    mask = np.where(mask!=n, 0, mask) # 기존 mask에서 최빈값 제외하고는 다 0으로 전환(노이즈 제거됨)
    return mask

1개의 댓글

comment-user-thumbnail
2024년 3월 5일

안녕하세요 질문 있어서 댓글 남깁니다 혹시 사진 파일은 어떻게 넣을 수 있을까요?
import matplotlib.pyplot as plt를 입력하니
aceback (most recent call last):
File "<pyshell#5>", line 1, in
import matplotlib.pyplot as plt
ModuleNotFoundError: No module named 'matplotlib
이런 문구만 나와서 질문 드립니다

답글 달기