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
cv2.findContours()
我制作了一个包含所有轮廓的列表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
),并绘制了它们我假设您只需要叶子内部的斑点
很难理解,你期望的结果是什么?我想在结果输出图像中去除叶子的边界,因为我不需要基于原始图像的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!=无:然后转到循环。