Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 我如何从这张图片中删除背景,只想从图片中删除莴苣?_Python_Opencv_Image Processing_Scikit Image_Edge Detection - Fatal编程技术网

Python 我如何从这张图片中删除背景,只想从图片中删除莴苣?

Python 我如何从这张图片中删除背景,只想从图片中删除莴苣?,python,opencv,image-processing,scikit-image,edge-detection,Python,Opencv,Image Processing,Scikit Image,Edge Detection,只是想保留莴苣,我有数百张这样的图像,并且会比较莴苣的大小,所以首先我尝试了canny边缘检测,但它似乎不起作用,任何想法都不知道如何进行此操作。一种可能的方法是使用图分割方法cv::ximgproc::Segmentation::GraphSegmentation,应用于转换为HSV或HSL的图像,其中您将V或L平面设置为常数以展平照明。只要修复下面列出的照明方法1,您就可以不使用阈值,否则,您可能需要一种简单的分类器方法,例如聚类技术,方法2结合连接的组件和对植物位置或颜色的假设,将检测到的

只是想保留莴苣,我有数百张这样的图像,并且会比较莴苣的大小,所以首先我尝试了canny边缘检测,但它似乎不起作用,任何想法都不知道如何进行此操作。一种可能的方法是使用图分割方法cv::ximgproc::Segmentation::GraphSegmentation,应用于转换为HSV或HSL的图像,其中您将V或L平面设置为常数以展平照明。

只要修复下面列出的照明方法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')

您可以将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()

你能发布更多的样本图片吗,比如5张,仅仅从这张图片中,我认为你可以根据rgb通道的一些自定义强度阈值来分离莴苣。@teng所有的图片几乎都是一样的,只是叶子的大小会增加,大小的增加也很小。这是谷歌硬盘的链接,你可以看一看示例图像,为什么你认为边缘检测算法可以很好地去除所有这些球上的莴苣?在你的图像中有这么多的边缘-这似乎不是一个好主意。。。使用颜色阈值-你的生菜是绿色的休息-而不是。蓝色里面可能有一些绿色,但比莴苣稍微少一点……除此之外。。。。所以是关于修正你的代码,而不是实现你的想法。请反复阅读,如果您有问题,请提供您的代码。展示您尝试过的内容和不起作用的内容,我们可能会帮助您改进它-但不要在颜色阈值任务中使用边缘检测器…我可能会同意@PatrickArtner的方法,也许这是一个好的开始:投票赞成照明平坦化建议。
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()