基于公司内部要搞细胞培养产品,后台图像算法有我维护编写。手写初版图个乐呵。主要是用于细胞图像处理,细胞计数。细胞活性检测等领域。巴拉巴拉。。。。。。。。
不装了,我摊牌了,我是个老油条,浑水摸鱼的,奥力给
因为anquanbaomi原因,核心算法不做赘述
环境:Ubuntu/windows、 python3.5~python3.9、 opencv库,numpy...
文件结构:
(需要图片的私聊我,在这里就不放了)
上菜
import cv2
import numpy as np
img = cv2.imread("../image/xx.jpg", 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
kernel = np.ones((2, 2), np.uint8) # 进行腐蚀膨胀操作
erosion = cv2.erode(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) # 找出连通域
# 对连通域面积进行比较
contours1 = [] # 建立空数组,放减去最小面积的数
for i in contours:
if cv2.contourArea(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 = cv2.moments(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) # 在中心坐标点上描绘数字
# 展示图片
roi = cv2.selectROI(windowName="EJ_liu_roi", img=img, showCrosshair=True, fromCenter=False)
x, y, w, h = roi
cv2.rectangle(img=img, pt1=(x, y), pt2=(x + w, y + h), color=(0, 0, 255), thickness=2)
# 选取框
cv2.namedWindow("EJ_liu", 0)
cv2.resizeWindow("EJ_liu", 1200, 800)
cv2.imshow("EJ_liu", draw)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 释放窗口
嗯,简单点就是这个样子,白嫖的大佬的。给你们两图,做做实验还是可以的。没事私聊我也可以。让我也摸会鱼嘻嘻。
图片处理前照片
41.jpg
处理后