改善西红柿的检测结果

时间:2018-07-12 23:46:15

标签: python-3.x opencv image-processing computer-vision scikit-image

我写了代码来检测图像中的西红柿(包括颜色分类)。 我的算法步骤是:转换rgb2yuv并在Y通道上执行直方图均衡化,转换yuv2rgb,转换rgb2gray并执行二进制阈值(手动)。然后标记灰度图像(连接的组件)。 最后,我使用for循环遍历属于每个标签的所有像素,找到轮廓和fitellipse(为过滤小或大圆圈和椭圆添加条件)。

结果是: result

结果显示,圆圈\椭圆不是紧身衣,其中一些甚至没有正确放置。

我试图更改参数值,但以上结果是我得到的最佳图像。 我可以添加或更改哪些内容以获得更好的结果? 我认为对图像进行预处理(也许可以有效地减少眩光,但我尝试了类似的操作,但没有成功)。

原始图片: original image

我的代码:

def main():


    fname=r'assorted_tomatoes.jpg'
    img = scipy.misc.imread(fname) # gray-scale image
    img2=np.zeros(img.shape)

    y,u,v=RGB2YUV(img)
    y,cdf=histeq(y)
    #y=hist(y)
    y*=255
    y=y.astype(int)

    r,g,b=YUV2RGB(y,u,v)
    img2[:,:,0],img2[:,:,1],img2[:,:,2]=r,g,b
    img2=img2.astype(np.uint8)

    gray_img = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)


    temp=cv2.threshold(gray_img, 200, 255, cv2.THRESH_BINARY)[1]
    for i in range(temp.shape[0]):
        for j in range(temp.shape[1]):
            if temp[i,j]>230:
                temp[i,j]=np.random.randint(0,70,size=1)

#gray_img=lightreduce(gray_img)
#gr=gamma_correctiom(gray_img,1.2)

    gray_img=gray_img-temp
#gray_img=gamma_correction(gray_img,1.1)

    threshold = 110

    # find connected components
    labeled, nr_objects = ndimage.label(gray_img > threshold) 

    lis=[]
    for i in range(nr_objects):
        a=np.argwhere(labeled==i)
        lis.append(a)

    ell=[]
    check=[]
    for i in range(len(lis)):
        a=lis[i]
        if a.shape[0]>300 and a.shape[0]<20000:
             black=np.zeros(labeled.shape)
             black=np.asarray(black,dtype=np.uint8)
             for coordiantes in lis[i]:
                black[coordiantes[0] , coordiantes[1]]=255
             _, contours, hierarchy = cv2.findContours(black,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

             for j in range(len(contours)):
                 if contours[j].shape[0]>50 and contours[j].shape[0]<2000:
                     con=contours[j][:,0,:]
                     ellipse = cv2.fitEllipse(np.asarray(con))
                     (x,y),(MA,ma),angle=ellipse

                     if MA/2>20 and ma/2>20 and MA/2<180 and ma/2<180:
                         check.append(ellipse)
                         h1,h2,w1,w2=[y-15,y+15,x-15,x+15]
                         if x-15>img.shape[1]:
                             w1,w2=[img.shape[1]-15,img.shape[1]]
                         elif x+15<0:
                             w1,w2=[0,15]
                         elif x-15<0 and x+15>0:
                             w1=0
                         elif x-15<img.shape[1] and x+15>img.shape[1]:
                             w2=img.shape[1]

                         if y-15>img.shape[0]:
                             h1,h2=[img.shape[0]-15,img.shape[0]]
                         elif y+15<0:
                             h1,h2=[0,15]
                         elif y-15<0 and y+15>0:
                             h1=0
                         elif y-15<img.shape[0] and y+15>img.shape[0]:
                             h2=img.shape[0]

                         color=check_color(img[int(h1):int(h2),int(w1):int(w2),:])    

                         if color=='red':
                             onehot=3
                         elif color=='green':
                             onehot=2
                         elif color=='brown':
                             onehot=4
                         elif color=='orange':
                             onehot=1

                         ell.append([ onehot , (MA+ma)/4])
                         cv2.ellipse(img, ellipse, (255,255,0), 2,cv2.LINE_AA)
                         cv2.circle(img,(int(x),int(y)),10,(255,255,0),-1)

忽略checkcolor函数调用,这不是我的问题。我想找到更多的圆形和椭圆形,并希望提高定位精度。

编辑: 灰度分割的结果: 细分

0 个答案:

没有答案