首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python图像处理:用电子显微镜测量层宽

Python图像处理:用电子显微镜测量层宽
EN

Stack Overflow用户
提问于 2014-06-27 08:59:35
回答 1查看 949关注 0票数 3

我有一张电子显微照片,描绘了生物系统中的致密和稀有层,如下所示。

所讨论的图层位于图像的中间,开始于标签"re“附近,然后逐渐缩小到左边。我想:

1)计算暗/密和光/稀有层的总数

2)测量每一层的宽度,因为右下角的黑色标尺长为1微米。

我一直在用Python做这件事。如果我预先裁剪图像,使其只包含少数几层的一部分,如下面所示的3层暗层和3层光层:

我能够使用以下代码计算层数:

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage
from PIL import Image

tap = Image.open("VDtap.png").convert('L')
tap_a = np.array(tap)

tap_g = ndimage.gaussian_filter(tap_a, 1)
tap_norm = (tap_g - tap_g.min())/(float(tap_g.max()) - tap_g.min())
tap_norm[tap_norm < 0.5] = 0
tap_norm[tap_norm >= 0.5] = 1

result = 255 - (tap_norm * 255).astype(np.uint8)

tap_labeled, count = ndimage.label(result)

plt.imshow(tap_labeled)
plt.show()

然而,我不知道如何合并缩放条和测量这些层的宽度,我已经计算了。更糟糕的是,当分析整个图像以包括缩放栏时,我甚至很难将图层与图像中的其他内容区分开来。

我很想知道如何解决这个问题。提前谢谢。

编辑1:

到目前为止,我在这个问题上取得了一些进展。如果我预先裁剪图像以便只包含一些层,我就可以使用下面的代码来获取每个层的厚度。

代码语言:javascript
复制
import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage
from PIL import Image
from skimage.measure import regionprops

tap = Image.open("VDtap.png").convert('L')
tap_a = np.array(tap)

tap_g = ndimage.gaussian_filter(tap_a, 1)
tap_norm = (tap_g - tap_g.min())/(float(tap_g.max()) - tap_g.min())
tap_norm[tap_norm < 0.5] = 0
tap_norm[tap_norm >= 0.5] = 1

result = 255 - (tap_norm * 255).astype(np.uint8)

tap_labeled, count = ndimage.label(result)

props = regionprops(tap_labeled)
ds = np.array([])

for i in xrange(len(props)):
    if i==0:
        ds = np.append(ds, props[i].bbox[1] - 0)
    else:
        ds = np.append(ds, props[i].bbox[1] - props[i-1].bbox[3])

    ds = np.append(ds, props[i].bbox[3] - props[i].bbox[1])

本质上,我发现了Python模块skimage,它可以接受一个标记的图像数组并返回每个标记对象的边界框的四个坐标;1和3个位置给出边界框的x坐标,因此它们的差异产生x维中每个层的范围。另外,for循环的第一部分( if-else条件)用于获取每个暗/密层之前的光/稀薄层,因为只有暗层才被ndimage.label标记。

不幸的是,这仍然不理想。首先,我不想事先裁剪图像,因为我打算对许多这样的图像重复这一过程。我曾经考虑过,也许可以使用某种过滤器来突出显示层的(粗糙的)周期性,但我不确定这种过滤器是否存在?第二,上面的代码实际上只给出了每个层的相对宽度--我还没有想出一种合并缩放条的方法,以便得到实际的宽度。

EN

回答 1

Stack Overflow用户

发布于 2014-07-09 06:49:37

我不想成为一个搞派对的人,但我认为你的问题比你最初想的要困难。我不能发布一个工作代码片段,因为您的文章中有太多需要深入关注的部分。我在几个生物/医学实验室工作过,这项工作通常是用人类来标记特定的图像点和计算机来计算距离。话虽如此,人们可能应该尝试自动化=D。

对你来说,问题是一个简单的,但乏味的工作,拿出一个尺子,做几百次测量。很适合电脑对吧?好吧,是的,也不是。计算机不知道如何识别图片中的任何一个波段,必须准确地告诉它所寻找的是什么,这将是一个棘手的问题。

识别标尺

你对你所有图像中的缩放条了解多少?它们总是相同数量的垂直和水平图片,它们总是纯黑的吗?总是只有一个条形(字母r的实线是怎样的)?我的建议是试试小波变换。想象一下函数的2d模拟

(可能有助于绘制此函数) f(x) =0(如果x= 1,则为1),如果x <1,则为1,如果x< 0.5,则为x> 0.5 -1。

然后,当我们的小波f(x,y)在图像上旋转时,只有当它找到黑尺度条时,输出图像才会有高值。另外,我设置为1的长度也可以调到小波,这也可以帮助你找到标度条。

找山脊

我会先解决上面的问题,因为它似乎更容易,并为您设置了这个问题。我会为这个子波构造另一个子波,但作为预处理步骤。对于这个小波,我会再次尝试一个2d的0-和盒函数,但是这个函数试图匹配三个(或更多)相邻的盒子。此外,除了高度和宽度参数的盒子,我们需要一个间距和倾斜角参数。您可能不需要非常接近实际值,只要足够接近图像的其余部分就会变黑。

测量山脊

有很多很多方法可以做到这一点,但让我们使用我们的前一步的简单性。拿出你的3方格小波答案,它应该集中在中间脊,并报告一个框的“宽度”,即它捕获的这三个脊的平均宽度。考虑到宽度的变化有多慢,可能已经足够接近了!

很好的狩猎!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24447868

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档