私は葉の病気を分類するプロジェクトに取り組んでいます。私は、kを適用しようとしているのは、病変領域が一緒にクラスタリングされるようにクラスタ化することを意味し、そのクラスタ化領域から特徴を抽出することができます。しかし、背景のために、私は病気の領域が背景と一緒に集中しているので正しくクラスタリングできません。k-meansクラスタリングを効果的に適用するために画像から背景を削除する方法
私の目標は、病気の領域をクラスタリングし、次に病気の領域から特徴を抽出して分類器を訓練することです。
アプローチ1から 私は葉の周りに輪郭を描くことを試みた後、四角形を描画し、その後、私は切り抜くことができますOpenCVのから分エリアRECT関数を使用しますが、輪郭は背景を除去するのに十分罰金ではありません。以下
コードである:
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から 直接kは画像にクラスタリングを意味適用します。しかし、このアプローチでは、病気の領域が背景と一緒に集まるので、病気の領域を一緒にまとめることはできません。
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