我写了代码来检测图像中的西红柿(包括颜色分类)。 我的算法步骤是:转换rgb2yuv并在Y通道上执行直方图均衡化,转换yuv2rgb,转换rgb2gray并执行二进制阈值(手动)。然后标记灰度图像(连接的组件)。 最后,我使用for循环遍历属于每个标签的所有像素,找到轮廓和fitellipse(为过滤小或大圆圈和椭圆添加条件)。
结果是:
结果显示,圆圈\椭圆不是紧身衣,其中一些甚至没有正确放置。
我试图更改参数值,但以上结果是我得到的最佳图像。 我可以添加或更改哪些内容以获得更好的结果? 我认为对图像进行预处理(也许可以有效地减少眩光,但我尝试了类似的操作,但没有成功)。
原始图片:
我的代码:
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函数调用,这不是我的问题。我想找到更多的圆形和椭圆形,并希望提高定位精度。
编辑: 灰度分割的结果: 细分