opencv——python细胞计数实现opencv——python细胞计数实现
import cv2
import numpy as  np
img=cv2.imread(r'D:\imge\cell.jpg',1)#读取图⽚
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将图⽚变为灰度图⽚
s((2,2),np.uint8)#进⾏腐蚀膨胀操作
de(gray,kernel,iterations=5)
dilation=cv2.dilate(erosion,kernel,iterations=5)
ret, thresh = cv2.threshold(dilation,150,255, cv2.THRESH_BINARY)# 阈值处理⼆值化⽤150不⽤255是因为有些细胞就直接变⽩thresh1 = cv2.GaussianBlur(thresh,(3,3),0)# ⾼斯滤波
然后,出连通域对连通域进⾏操作。因为处理后图仍有细⼩的杂⽂⽆法去除,通过观察细胞⼤⼩确定⾯积,将⼩值过滤。#对连通域⾯积进⾏⽐较
area=[]#建⽴空数组,放连通域⾯积
contours1=[]#建⽴空数组,放减去后的数组
for i in contours:
# area.urArea(i))
# print(area)
urArea(i)>30:# 计算⾯积去除⾯积⼩的连通域
contours1.append(i)
print(len(contours1)-1)#计算连通域个数
draw=cv2.drawContours(img,contours1,-1,(0,255,0),1)#描绘连通域
其次,因为数数的问题,每个细胞要显⽰数字。做法就是求每个连通域的重⼼,将数字绘制在重⼼上即可。
#求连通域重⼼以及在重⼼坐标点描绘数字
学python看谁的视频比较好
for i,j in zip(contours1,range(len(contours1))):
M = s(i)
cX=int(M["m10"]/M["m00"])
cY=int(M["m01"]/M["m00"])
draw1=cv2.putText(draw,str(j),(cX, cY),1,1,(255,0,255),1)#在中⼼坐标点上描绘数字
最后展⽰图即可
cv2.imshow("draw",draw1)
cv2.imshow("thresh1",thresh1)
cv2.waitKey()
cv2.destroyWindow()
最后源代码
import cv2
import numpy as  np
img=cv2.imread(r'D:\imge\cell.jpg',1)#读取图⽚
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#将图⽚变为灰度图⽚
s((2,2),np.uint8)#进⾏腐蚀膨胀操作
de(gray,kernel,iterations=5)#膨胀
dilation=cv2.dilate(erosion,kernel,iterations=5)#腐蚀
ret, thresh = cv2.threshold(dilation,150,255, cv2.THRESH_BINARY)# 阈值处理⼆值法
thresh1 = cv2.GaussianBlur(thresh,(3,3),0)# ⾼斯滤波
contours,hirearchy=cv2.findContours(thresh1, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 出连通域
#对连通域⾯积进⾏⽐较
area=[]#建⽴空数组,放连通域⾯积
contours1=[]#建⽴空数组,放减去最⼩⾯积的数
for i in contours:
# area.urArea(i))
# print(area)
urArea(i)>30:# 计算⾯积去除⾯积⼩的连通域
contours1.append(i)
print(len(contours1)-1)#计算连通域个数
draw=cv2.drawContours(img,contours1,-1,(0,255,0),1)#描绘连通域
#求连通域重⼼以及在重⼼坐标点描绘数字
for i,j in zip(contours1,range(len(contours1))):
M = s(i)
cX=int(M["m10"]/M["m00"])
cY=int(M["m01"]/M["m00"])
draw1=cv2.putText(draw,str(j),(cX, cY),1,1,(255,0,255),1)#在中⼼坐标点上描绘数字
#展⽰图⽚
cv2.imshow("draw",draw1)
cv2.imshow("thresh1",thresh1)
cv2.waitKey()
cv2.destroyWindow()
有不完美的地⽅,最⼤的连通域不知道怎么形成的,如果知道可以告诉下,让我修改下程序,thanks。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。