Как убрать фон с этого изображения, просто хочу салат с картинки? - PullRequest
0 голосов
/ 24 ноября 2018

image of lettuce

Просто хочу сохранить салат, у меня есть сотни таких изображений, и я сравнил бы размер салата, поэтому для начала я попробовал консервный крайобнаружение, но это, похоже, не работает, любая идея, как двигаться дальше с этим

Ответы [ 3 ]

0 голосов
/ 24 ноября 2018

Вы можете избавиться от порога, пока вы исправите свое освещение (метод 1, указанный ниже), если нет, вам может понадобиться простой метод классификатора (например, метод кластеризации, метод 2) в сочетании с подключенными компонентами и предположениемна месте растения или цвета, чтобы назначить обнаруженный класс для растения.

from scipy.misc import imread
import matplotlib.pyplot as plt
import matplotlib.patches as patches
%matplotlib inline
import matplotlib
import numpy as np

# read the image
img = imread('9v5wv.png')

# show the image
fig,ax = plt.subplots(1)
ax.imshow(img)
ax.grid('off')

# show the r,g,b channels separately.
for n,d in enumerate([('r',0),('g',1),('b',2)]):
  k,v = d
  plt.figure(n)
  plt.subplot(131)
  plt.imshow(arr[:,:,v],cmap='gray')
  plt.grid('off')
  plt.title(k)
  plt.subplot(133)
  _=plt.hist(arr[:,:,v].ravel(),bins=100)


# method 1, rgb thresholding will not work when lighting changes
arr = img

r_filter = lambda x: x[:,:,0] < 100
g_filter = lambda x: x[:,:,1] > 80
b_filter = lambda x: x[:,:,2] < 200
mask=np.logical_and(np.logical_and(r_filter(arr),g_filter(arr)),b_filter(arr))


plt.imshow(mask,cmap='gray')
plt.grid('off')

enter image description here

# method 2, kmeans clustering
from sklearn.cluster import KMeans
arr = matplotlib.colors.rgb_to_hsv(img[:,:,0:3])
# ignore v per Yves Daoust
data = np.array(arr[:,:,0:2])
x,y,z = data.shape
X = np.reshape(data,(x*y,z))
kmeans = KMeans(n_clusters=6, random_state=420).fit(X)
mask = np.reshape(kmeans.labels_,(x,y,))

plt.imshow(mask==0,cmap='gray')
plt.grid('off')

enter image description here

0 голосов
/ 24 ноября 2018

Можно преобразовать изображение RGB в изображение HSV и сегментировать область зеленого цвета.

import cv2
import numpy as np

frame=cv2.imread('a.png')
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

lower = np.array([50,50,50])
upper = np.array([70,255,255])

mask = cv2.inRange(hsv, lower, upper)
res = cv2.bitwise_and(frame,frame, mask= mask)

cv2.imshow('frame',frame)
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()

The final output

0 голосов
/ 24 ноября 2018

Возможный подход заключается в использовании метода сегментации графика (cv :: ximgproc :: segmentation :: GraphSegmentation), который вы применяете к изображению, преобразованному в HSV или HSL, где для плоскости V или L задается постоянная величинасгладить освещение.

...