Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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 我想使用opencv删除边界_Python_Python 3.x_Opencv_Image Processing - Fatal编程技术网

Python 我想使用opencv删除边界

Python 我想使用opencv删除边界,python,python-3.x,opencv,image-processing,Python,Python 3.x,Opencv,Image Processing,我有这个原始图像: 然后,我将以下代码应用于 将原始图像转换为HSV图像 然后使用cv2.findContours()我制作了一个包含所有轮廓的列表 然后,我已经删除了所有的轮廓面积小于30 然后我得到了以下图像: 我想要的是从生成的图像中删除边界,它没有任何用处(叶子的外部边界)。我只需要叶子的内部补丁。 这是我使用的代码 import cv2 import numpy as np img = cv2.imread('Apple___Blackrot30.JPG') hsv = cv2.c

我有这个原始图像:

然后,我将以下代码应用于

  • 将原始图像转换为HSV图像
  • 然后使用
    cv2.findContours()
    我制作了一个包含所有轮廓的列表

  • 然后,我已经删除了所有的轮廓面积小于30

  • 然后我得到了以下图像:
  • 我想要的是从生成的图像中删除边界,它没有任何用处(叶子的外部边界)。我只需要叶子的内部补丁。 这是我使用的代码

    import cv2
    import numpy as np
    img = cv2.imread('Apple___Blackrot30.JPG')
    hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)     
    lower_gr = np.array([25,0,0])
    upper_gr = np.array([90,255,255])
    mask = cv2.inRange(hsv,lower_gr,upper_gr)
    mask=~mask   
    res = cv2.bitwise_and(img,img,mask = mask)
    blur = cv2.bilateralFilter(res,9,75,75)
    im2,cont,_ = cv2.findContours(mask,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
    areas = [cv2.contourArea(each_conts) for each_conts in cont]
    cont_counter = 0
    for each_conts in areas:
        if each_conts < 30:
            cv2.fillPoly(im2, pts =[cont[cont_counter]], color=(0,0,0))
        if each_conts > 1024:
            cv2.drawContours(mask, cont[cont_counter], 0, (255,255,255), -1)    
        cont_counter+=1
    
    cv2.imshow('cn',im2)
    
    导入cv2
    将numpy作为np导入
    img=cv2.imread('Apple\uuuuuu Blackrot30.JPG')
    hsv=cv2.CVT颜色(img,cv2.COLOR\U BGR2HSV)
    lower_gr=np.数组([25,0,0])
    上_gr=np.数组([90255255])
    遮罩=cv2.在范围内(hsv,下禁区,上禁区)
    面具=~面具
    res=cv2.按位_和(img,img,mask=mask)
    模糊=cv2。双边滤波器(分辨率,9,75,75)
    im2,cont,=cv2.查找对象(掩码,cv2.检索树,cv2.链近似值\u简单)
    面积=[cv2.cont中每个cont的轮廓面积(每个cont]
    连续计数器=0
    对于区域中的每个内容:
    如果每个内容小于30:
    cv2.fillPoly(im2,pts=[cont[cont_counter]],color=(0,0,0))
    如果每个参数都大于1024:
    cv2.绘制轮廓(掩模,连续[连续计数器],0,(255255),-1)
    连续计数器+=1
    cv2.imshow('cn',im2)
    
    您可以使用的概念来解决此问题。但是有一个警告,你所有的图片必须与问题中的图片相同

    我刚刚在你的代码中添加了一些额外的东西

    代码:

    img2 = img.copy()
    im2, cont, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    l = []
    for e, h in enumerate(hierarchy[0]):
        #print (e, h[3])
        if h[3] == -1:
            l.append(e)
    
    for i in l:
        if cv2.contourArea(cont[i]) < 1000:   
            cv2.drawContours(img2, [cont[i]], -1, (0, 255, 255), 2)
    
    cv2.imshow('img2', img2)
    
    img2=img.copy()
    im2,cont,hierarchy=cv2.findContours(掩码,cv2.RETR\u树,cv2.CHAIN\u近似值\u简单)
    l=[]
    对于枚举(层次结构[0])中的e,h:
    #打印(e,h[3])
    如果h[3]==-1:
    l、 附加(e)
    对于l中的i:
    如果cv2.轮廓面积(续[i])<1000:
    cv2.等高线图(img2,[cont[i]],-1,(0,255,255),2)
    cv2.imshow('img2',img2)
    
    结果:

    img2 = img.copy()
    im2, cont, hierarchy = cv2.findContours(mask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
    
    l = []
    for e, h in enumerate(hierarchy[0]):
        #print (e, h[3])
        if h[3] == -1:
            l.append(e)
    
    for i in l:
        if cv2.contourArea(cont[i]) < 1000:   
            cv2.drawContours(img2, [cont[i]], -1, (0, 255, 255), 2)
    
    cv2.imshow('img2', img2)
    

    层次结构
    返回表示等高线父子关系的数组。根据文档链接

    它是一个由四个值组成的数组:[下一个、上一个、第一个子、父]


    层次结构
    数组中,我扫描了
    列(第4列)以查看它是否没有父轮廓(
    -1
    ),并绘制了它们

    我假设您只需要叶子内部的斑点

  • 使用大津算法进行分割
  • 应用整体填充操作以确保捕获所有叶像素
  • 仅提取内部轮廓 使用opencv可以简单地完成以下所有操作:

  • 很难理解,你期望的结果是什么?我想在结果输出图像中去除叶子的边界,因为我不需要基于原始图像的itA颜色阈值,也许?如果特别是在本例中,您可以设置图像阈值,使其仅保留黄色/棕色部分,然后应用边缘检测器。对于“enumerate(层次结构[0])中的e,h”行,我得到一个错误“nonetype对象不可下标”:@Paraskumarangyan检查层次结构是否为空我该如何做我有一个非常大的图像数据库。我尝试了各种方法,如'len(hierarchy[0])==0',但它给出了相同的错误。问题是我有非常大的数据集,我甚至想删除图像,但它不起作用。我试着打印图像名称,但它只是给我这个错误信息给我。如果在图像中找不到轮廓,错误就会显示出来。在这一行之后,
    im2,cont,hierarchy=cv2.findContours(mask,cv2.RETR\u TREE,cv2.CHAIN\u APPROX\u SIMPLE)
    如果cont!=无:然后转到
    循环。