【问题标题】:Image segmentation to find cells in biological images图像分割以在生物图像中查找细胞
【发布时间】:2019-09-23 10:43:14
【问题描述】:

我有一堆细胞图像,我想提取细胞的位置。我目前正在使用圆形霍夫变换,它工作正常,但经常搞砸。想知道人们是否有任何指示。抱歉,这不是一个专门关于软件的问题——它是如何在图像分割问题中获得更好的性能。

我在 skimage 中尝试了其他一些东西,但效果有限,例如轮廓查找、边缘检测和活动轮廓。没有什么开箱即用的效果很好,尽管可能只是我没有正确处理参数。我没有做过太多的图像分割,我真的不知道这些东西是如何工作的,也不知道最好的方法是什么。

这是我目前使用的代码,它将灰度图像作为一个 numpy 数组并将单元格查找为一个圆圈:

import cv2
import numpy as np
smallest_dim = min(img.shape)
min_rad = int(img.shape[0]*0.05)
max_rad = int(img.shape[0]*0.5) #0.5
circles = cv2.HoughCircles((img*255).astype(np.uint8),cv2.HOUGH_GRADIENT,1,50,
    param1=50,param2=30,minRadius=min_rad,maxRadius=max_rad)
circles = np.uint16(np.around(circles))
x, y, r = circles[0,:][:1][0]

这是一个示例,其中代码发现错误的圆圈作为单元格的边界。它似乎被牢房周围的垃圾弄糊涂了:

【问题讨论】:

  • 一些预处理可能会有所帮助。请注意,一般来说,所有计算机视觉问题都是困难的,并且在大多数情况下,成功的解决方案都是经过高度微调和依赖于应用程序的。没有灵丹妙药,还没有
  • 链接应该现在可以使用

标签: python image-processing image-segmentation cv2 hough-transform


【解决方案1】:

我认为一个问题可能是圆的绘制(坐标可能是错误的)。

另外,就像@Nicos 提到的那样,传统图像处理涉及很多调整以使特定案例工作(虽然最近的机器学习方法,调整是为了让模型不会过度训练),我对 skimage 的尝试如下所示。半径范围、圆数、边缘检测图像,都需要调整……考虑到图像之间和图像内部的潜在变化。在这张图片中,至少对我来说,有 3 个渐变的圆圈,从 canny 边缘检测图像中,你可以看到我们得到了超过 3 个圆圈,此外,“照明”似乎在不同的位置(因为这是一张 sem 图像)?!

import matplotlib.pyplot as plt
import numpy as np
import imageio

from skimage import data, color
from skimage.transform import hough_circle, hough_circle_peaks
from skimage.feature import canny
from skimage.draw import circle_perimeter
from skimage.util import img_as_ubyte
!wget https://i.stack.imgur.com/2tsWw.jpg
# rgb to gray https://stackoverflow.com/a/51571053/868736
im = imageio.imread('2tsWw.jpg')
gray = lambda rgb : np.dot(rgb[... , :3] , [0.299 , 0.587, 0.114]) 
gray = gray(im)  
image = np.array(gray[60:220,210:450])
plt.imshow(image,cmap='gray')

edges = canny(image, sigma=3,)
plt.imshow(edges,cmap='gray')

overlayimage = np.copy(image)

# https://scikit-image.org/docs/dev/auto_examples/edges/plot_circular_elliptical_hough_transform.html

hough_radii = np.arange(30, 60, 2)
hough_res = hough_circle(edges, hough_radii)

# Select the most prominent X circles
x=1
accums, cx, cy, radii = hough_circle_peaks(hough_res, hough_radii,
                                           total_num_peaks=x)
# Draw them
fig, ax = plt.subplots(ncols=1, nrows=1, figsize=(10, 4))
#image = color.gray2rgb(image)
for center_y, center_x, radius in zip(cy, cx, radii):
    circy, circx = circle_perimeter(center_y, center_x, radius)
    overlayimage[circy, circx] = 255

print(radii)
ax.imshow(overlayimage,cmap='gray')
plt.show()

【讨论】:

  • 您可以使用边缘提取和合适的阈值(可能进行一些预处理以平滑和去除周围区域,例如对比度增强和形态处理可能会有所帮助)来仅计算细胞的边缘周围层。然后对该数据使用 HoughCircles 方法
猜你喜欢
  • 2019-08-16
  • 2016-09-13
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2017-12-15
  • 2022-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多