Python 菌落计数

原图:

1.目标区域分离,圆盘切割

# -*- coding: utf-8 -*-
"""
Created on Fri Dec 28 14:02:31 2018

@author: Lenovo
"""

import numpy as np
import cv2 as cv
import copy
from skimage import exposure

a = cv.imread('xiaguang.jpg')

kernel = np.ones((3,3),np.uint8)  
w = int(a.shape[0]/5)
h = int(a.shape[1]/5)
a = cv.resize(a,(h,w))
ry = a.copy()
#a[a>0.3*255] = 255
#a[a<=0.3*255] = 0

parameter=10.2
gamma_img = exposure.adjust_gamma(a, parameter)
gamma_img = cv.cvtColor(gamma_img, cv.COLOR_BGR2GRAY)
gamma_img[gamma_img<0.3*255] = 0
#gamma_img = cv.medianBlur(gamma_img ,3)
#gamma_img = cv.medianBlur(gamma_img ,3)
gamma_img = cv.erode(gamma_img,kernel,iterations = 1)
gamma_img = cv.dilate(gamma_img,kernel,iterations = 2)

cv.imshow('bccccccccc',gamma_img)
cv.waitKey(0)
cv.destroyAllWindows()

#gamma_img = cv.Canny(gamma_img,50,150)
#gamma_img[gamma_img<=0.6*255] = 0

#gamma_img[gamma_img<0.3*255] = 0
#gamma_img[gamma_img>0.5*255] = 0
temp = np.ones(a.shape,np.uint8)*0
#gamma_img[gamma_img>=0.3*255 and gamma_img<0.9*255] = 255
hdddd = cv.findContours(gamma_img,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)  
contours = hdddd[1]
dddd = cv.drawContours(temp,contours,-1,(255,255,255),5)

contour_index = []
for i in contours:
    
    print(i.shape[0])
    contour_index.append(i)
#max_contour_index = contour_index.index(max(contour_index))

#aaaaaaaaaaaaaa = contours[max_contour_index]
contour_index = np.concatenate([en for en in contour_index],axis=0)

tt = np.ones(a.shape,np.uint8);
(x, y), radius = cv.minEnclosingCircle(contour_index)
(x, y, radius) = np.int0((x, y, radius))  # 圆心和半径取整
print(x, y, radius)
cv.circle(tt, (x, y), radius, (0, 0, 255), 2)
cv.imshow('tt',tt)
cv.waitKey(0)
cv.destroyAllWindows()

cv.imshow('bccccccccc',gamma_img)
cv.waitKey(0)
cv.destroyAllWindows()
cv.imshow('bccccccccc',temp)
cv.waitKey(0)
cv.destroyAllWindows()



#cv.imshow('bccccccccc',tt)
#cv.waitKey(0)
#cv.destroyAllWindows()
for i in range(w):
    for j in range(h):
        if np.sqrt(np.square(i-y)+np.square(j-x))>radius:
            ry[i,j]=0
cv.imshow('ry',ry)   
cv.waitKey(0)
cv.destroyAllWindows()
#-------------------以上完成切割操作,ry为切割后的圆盘内部图像------------------------

效果图

计数代码:

# -*- coding: utf-8 -*-
"""
Created on Fri Dec 28 14:02:31 2018

@author: Lenovo
"""

import numpy as np
import cv2 as cv
import copy
from skimage import exposure

a = cv.imread('st.jpg')

kernel = np.ones((3,3),np.uint8)  
w = int(a.shape[0]/5)
h = int(a.shape[1]/5)
a = cv.resize(a,(h,w))
ry = a.copy()
rry = a.copy()
#a[a>0.3*255] = 255
#a[a<=0.3*255] = 0

parameter=10.2
gamma_img = exposure.adjust_gamma(a, parameter)
gamma_img = cv.cvtColor(gamma_img, cv.COLOR_BGR2GRAY)
gamma_img[gamma_img<0.3*255] = 0
#gamma_img = cv.medianBlur(gamma_img ,3)
#gamma_img = cv.medianBlur(gamma_img ,3)
gamma_img = cv.erode(gamma_img,kernel,iterations = 1)
gamma_img = cv.dilate(gamma_img,kernel,iterations = 2)

cv.imshow('bccccccccc',gamma_img)
cv.waitKey(0)
cv.destroyAllWindows()

#gamma_img = cv.Canny(gamma_img,50,150)
#gamma_img[gamma_img<=0.6*255] = 0

#gamma_img[gamma_img<0.3*255] = 0
#gamma_img[gamma_img>0.5*255] = 0
temp = np.ones(a.shape,np.uint8)*0
#gamma_img[gamma_img>=0.3*255 and gamma_img<0.9*255] = 255
hdddd = cv.findContours(gamma_img,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)  
contours = hdddd[1]
dddd = cv.drawContours(temp,contours,-1,(255,255,255),5)

contour_index = []
for i in contours:
    
    print(i.shape[0])
    contour_index.append(i)
#max_contour_index = contour_index.index(max(contour_index))

#aaaaaaaaaaaaaa = contours[max_contour_index]
contour_index = np.concatenate([en for en in contour_index],axis=0)

tt = np.ones(a.shape,np.uint8);
(x, y), radius = cv.minEnclosingCircle(contour_index)
(x, y, radius) = np.int0((x, y, radius))  # 圆心和半径取整
print(x, y, radius)
cv.circle(tt, (x, y), radius, (0, 0, 255), 2)
cv.imshow('tt',tt)
cv.waitKey(0)
cv.destroyAllWindows()

cv.imshow('bccccccccc',gamma_img)
cv.waitKey(0)
cv.destroyAllWindows()
cv.imshow('bccccccccc',temp)
cv.waitKey(0)
cv.destroyAllWindows()



#cv.imshow('bccccccccc',tt)
#cv.waitKey(0)
#cv.destroyAllWindows()
for i in range(w):
    for j in range(h):
        if np.sqrt(np.square(i-y)+np.square(j-x))>radius:
            ry[i,j]=0
cv.imshow('ry',ry)   
cv.waitKey(0)
cv.destroyAllWindows()
#-------------------以上完成切割操作,ry为切割后的圆盘内部图像------------------------


ry = exposure.adjust_gamma(ry, 10.2)
ry_g = cv.cvtColor(ry,cv.COLOR_BGR2GRAY)
ry_g[ry_g>200] = 0
ry_g[ry_g<50] = 0
ry_g = cv.medianBlur(ry_g ,3)
ry_g = cv.dilate(ry_g,kernel,iterations = 2)
#ry_canny = cv.Canny(ry,0,200)
#cv.imshow('ry_canny',ry_canny)   
#cv.waitKey(0)
#cv.destroyAllWindows()

cv.imshow('rry',ry_g)   
cv.waitKey(0)
cv.destroyAllWindows()


ry_hd = cv.findContours(ry_g,cv.RETR_TREE,cv.CHAIN_APPROX_SIMPLE)  
ry_contours = ry_hd[1]
#dddd = cv.drawContours(temp,ry_contours,-1,(255,255,255),2)
#cv.imshow('ry_canny',temp)   
cv.waitKey(0)
cv.destroyAllWindows()
cclist = []
for i in ry_contours:
    
    print(i.shape[0])
    if i.shape[0]<50 and i.shape[0]>3:
        cclist.append(i)
        


temp1 = np.ones(a.shape,np.uint8)*0
dddd11 = cv.drawContours(rry,cclist,-1,(255,0,255),2)
cv.imshow('ry_canny',dddd11)   
cv.waitKey(0)
cv.destroyAllWindows()





#kernel = np.ones((3,3),np.uint8)  
#gamma_img = cv.dilate(gamma_img,kernel,iterations = 2)

circles = cv.HoughCircles(gamma_img,cv.HOUGH_GRADIENT,1,1,
                            param1=100,param2=10,minRadius=0,maxRadius=10)

for i in circles[0,:]:
    # draw the outer circle
    cv.circle(a,(i[0],i[1]),i[2],(255,0,0),2)
    # draw the center of the circle
    cv.circle(a,(i[0],i[1]),2,(255,0,0),3)
    
cv.imshow('detected circles',a)
cv.waitKey(0)
cv.destroyAllWindows()
#w = int(a.shape[0]/5)
#h = int(a.shape[1]/5)
#
#a = cv.resize(a,(h,w))
#b = a.copy()
#f = a.copy()
#a = cv.medianBlur(a,9)
#a = cv.cvtColor(a, cv.COLOR_BGR2GRAY)
#a = cv.Canny(a,0,255)
#kernel = np.ones((6,6),np.uint8) 
##a = cv.erode(a,kernel,iterations = 20)
#a = cv.dilate(a,kernel,iterations = 20)
#cv.imshow('ya',a)
#cv.waitKey(0)
#cv.destroyAllWindows()
#
#
#
#temp = np.ones(a.shape,np.uint8)*0
#
#h = cv.findContours(a,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE) 
#contours = h[1]
#dddd = cv.drawContours(temp,contours,-1,(255,255,255),3)
#
#
#cv.imshow('dddd111111',dddd)
#cv.waitKey(0)
#cv.destroyAllWindows()
##
#tt = np.ones(dddd.shape,np.uint8);
#(x, y), radius = cv.minEnclosingCircle(contours[0])
#(x, y, radius) = np.int0((x, y, radius))  # 圆心和半径取整
#print(x, y, radius)
#cv.circle(tt, (x, y), radius, (0, 0, 255), 2)
#cv.imshow('bccccccccc',tt)
#cv.waitKey(0)
#cv.destroyAllWindows()

计数效果:

高密度菌落检测:

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南七小僧

打赏后,可以添加微信一对一咨询

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值