나는 나뭇잎의 질병을 분류하는 프로젝트를 진행 중이다. 나는 k를 적용하려고하는데, 병이있는 영역이 함께 클러스터링 될 수 있도록 클러스터링을 의미하고 그런 다음 그 클러스터링 된 영역에서 피쳐를 추출 할 수 있습니다. 그러나 배경 때문에 질병이있는 지역이 배경과 밀집되어 있으므로 올바르게 클러스터링 할 수 없습니다.k-means 클러스터링을 효율적으로 적용하기 위해 이미지에서 배경을 제거하는 방법
내 목표는 질병이있는 영역을 클러스터링 한 다음 질병이있는 영역에서 특징을 추출하여 분류자를 훈련시키는 것입니다.
접근 1- 은 내가자를 수 있습니다, 이후 사각형을 그립니다하고 잎 주위에 윤곽을 그린 후 OpenCV의에서 최소 면적 RECT 기능을 사용하려고하지만 윤곽 배경을 제거 할만큼 잘되지 않습니다 . K에 직접 이미지 클러스터링 수단을 적용 -
lower_green = np.array((60-s,100,50))
upper_green = np.array((60+s,255,255))
name = "Apple_healthy/image_85.jpg"
bgr = cv2.imread(name)
hsv = cv2.cvtColor(bgr, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower_green, upper_green)
mask = cv2.dilate(mask, None, iterations=50)
_, contours, hier = cv2.findContours(mask.copy(),cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
mask = cv2.bitwise_not(mask)
cnt = contours[-1]
cv2.drawContours(bgr,[cnt],0,(0,0,255), 2)
cv2.imshow('image', bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()
rect = cv2.minAreaRect(cnt)
box = cv2.boxPoints(rect)
box = np.int0(box)
cv2.drawContours(bgr,[box],0,(0,0,255),2)
cv2.imshow('sad',bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()
접근법 2 : 이하
코드이다. 그러나이 접근법에서는 질병이있는 영역이 배경과 밀집되어 있으므로 병이있는 영역을 함께 클러스터링 할 수 없습니다.img = cv2.imread('Apple_black_rot/image_85.jpg')
Z = img.reshape((-1,3))
# convert to np.float32
Z = np.float32(Z)
# define criteria, number of clusters(K) and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 16
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_RANDOM_CENTERS)
# Now convert back into uint8, and make original image
center = np.uint8(center)
res = center[label.flatten()]
res2 = res.reshape((img.shape))
cv2.imshow('res2',res2)
cv2.waitKey(0)
cv2.destroyAllWindows()
원본 이미지 병에 걸린 지역은 별개의 색상이
, 난 당신이 병에 걸린 영역과 배경을 부르는 모른다. 나는 보라색 기질, 검은 그림자, 녹색 잎과 갈색의 다양한 그늘에 얼룩이 보인다. 뭐라구? 명시 해주십시오. –
배경에 보라색 기판과 검은 그림자가 포함되어 있습니다. 병이있는 부위에는 잎에 갈색의 다양한 얼룩이 포함됩니다. – rishi