대부분의 식물은 초록색을 띄기때문에 이미지에서 식물을 분리하기위해 색상을 추출하는 방법을 사용할 수 있다.
디지털 색체시스템으로는 HSV, RGB, LAB, CMYK 가 있다.
이미지 출처-https://darkpgmr.tistory.com/66
데이터는 케글의 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
안녕하세요 질문 있어서 댓글 남깁니다 혹시 사진 파일은 어떻게 넣을 수 있을까요?
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
이런 문구만 나와서 질문 드립니다