显微晶体颗粒物体长度检测

信息处理 图像处理 Python 图像分割
2022-02-16 02:44:50

嗨,我尝试从此图像中检测粒子长度大小
原始图像

我想得到粒子的长度大小,如下所示。并使用质心获取粒子大小的直方图并检测如下线:

在此处输入图像描述

我尝试使用分水岭。但我对这段代码的了解仍然很低。我想问的是:1.如何像下面这张图片一样进行分割,以便我可以评估我的分割..我不知道如何显示它(我会分享我的代码)

在此处输入图像描述

  1. 如何分离与其他粒子结合的粒子。我得到了这个轮廓

在此处输入图像描述

这是我的代码:

from __future__ import print_function
from imutils import perspective
from imutils import contours
import numpy as np
import argparse
import imutils
import cv2
import scalar
import sys
from scipy.spatial import distance as dist
import scipy.ndimage as ndi
import matplotlib.pyplot as plt
from skimage import filters
from sklearn import cluster
from scipy import ndimage
from skimage.feature import peak_local_max
from skimage.morphology import watershed
from scipy.ndimage import label

img = cv2.imread("C:\\Users\\adiyu\Pictures\\snipping\\c3smeasure.png", 
cv2.IMREAD_COLOR)
kernel = np.array([[-1,-1,-1],[-1,9,-1], [-1,-1,-1]])
kernel2 = np.ones((3,3),np.uint8)

img=cv2.filter2D(img,-255, kernel)
img = cv2.medianBlur(img,3)
img_np = np.array(img)
img_np_rgb = cv2.cvtColor(img_np,cv2.COLOR_RGBA2RGB)


#Kmeans cluster using Opencv
Z = img.reshape((-1,3))

# convert to np.float32
Z = np.float32(Z)

# define criteria, number of clusters(K) and apply kmeans()
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
K = 3
ret,label,center=cv2.kmeans(Z,K,None,criteria,10,cv2.KMEANS_PP_CENTERS)
# Now convert back into uint8, and make original image
center = np.uint8(center)


res = center[label.flatten()]
res2 = res.reshape((img.shape))
gray= cv2.cvtColor(res2,cv2.COLOR_BGR2GRAY)
gray = cv2.fastNlMeansDenoising(gray, None, 6,7,21)


cv2.imshow('res2',res2)
cv2.imshow('gray',gray)
thresh = cv2.threshold(gray, 100, 255, cv2.THRESH_BINARY_INV + 
cv2.THRESH_OTSU + cv2.THRESH_OTSU)[1]
cv2.imshow('thresh',thresh)
opening = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel, iterations=2)
cv2.imshow("opening", opening)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE,kernel2, iterations=2)
cv2.imshow("closing", closing)
fg = cv2.erode(closing,None,iterations = 2)
cv2.imshow("fg", fg)

# sure background area
sure_bg = cv2.dilate(opening,kernel,iterations=3)
cv2.imshow("sure_bg", sure_bg)
# Finding sure foreground area
dist_transform = cv2.distanceTransform(opening,cv2.DIST_L2,5)
ret, sure_fg = cv2.threshold(dist_transform,0.1*dist_transform.max(),255,0)

# Finding unknown region
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg,sure_fg)
cv2.imshow("unknown", unknown)

# Marker labelling
ret, markers = cv2.connectedComponents(sure_fg)

# Add one to all labels so that sure background is not 0, but 1
markers = markers+1

# Now, mark the region of unknown with zero
markers[unknown==255] = 0
markers = cv2.watershed(img,markers)
img[markers == -1] = [255,0,0]

cv2.imshow("img", img)

cv2.waitKey(0)
cv2.destroyAllWindows()enter preformatted text here

欢迎任何建议..谢谢你

1个回答

它必须使用python吗?为了探索您的工作流程和管道以进行一种图像分析,我建议获取ImageJ / FiJi将它与 MorphoLibJ 插件一起使用以获得更多关于形态分割的选项。确定工作流程后,您可以在 python 中对其进行编码以进行批量分析。

无论如何,无论您使用哪种软件,您的工作流程都应该是这样的:

  1. 通过 rgb 阈值或通过预先转换为灰度来分割粒子。优选自适应方法。你也可以使用你得到的轮廓。目的是生成二进制(黑/白)图像,其中您的粒子是白色的,其他一切都是黑色的(或相反)。

  2. 在此图像上,您执行“距离变换分水岭”这也适用于 python

  3. 对生成的图像进行光学检查,以确认粒子没有过度分割或分割不足。如果需要,可以优化动态、距离度量、播种等参数。

  4. 如果正确分割,则对图像执行粒子分析在 ImageJ 中,您可以转到“分析 -> 设置测量”并选择要测量的变量 - 例如 Feret 直径 - 长度。在 python 中我没有足够的经验,但我会使用本教程