【问题标题】:How do I quantify the similarity between spatial patterns如何量化空间模式之间的相似性
【发布时间】:2021-01-27 02:51:25
【问题描述】:

问题表述

  • 假设我有几个 10000*10000 的网格(可以转换成 10000*10000 的灰度图像。我会认为imagegrid 如下),并且在每个网格点,都有一些 value(在我的情况下,它是在该像素位置表达的特定基因的拷贝数,请注意每个网格的位置都相同)。我想要的是量化这种类型的两个 2D 空间点模式之间的相似性(即两个不同基因的空间表达模式),并将所有基因对排列为“最相似”以“最不同”的方式。请注意,我关心的不是表达水平绝对值的空间模式,而是我关心的相对模式。因此,在比较相应像素时,我可能需要使用一些相关性而不是距离指标。

  • 最简单的方法可能是直接将所有像素一起视为一个向量,并计算两个向量之间的一些相关性度量。然而,这并没有考虑空间信息。我最感兴趣的那些基因具有空间模式,即聚类和自相关会影响它们的表达模式(尽管它们的“簇”可能采取非常细的形状而不是粘在一起,例如皮肤细胞特有的基因),这意味着通常图像会有几个峰值局部区域,而其他像素的表达水平会非常低(接近 0)。

可能的路线

  • 我不确定我是否应该 (1) 考虑应用图像处理中的 图像相似性比较 算法,将局部结构相似性考虑在内(例如,SSIM、SIFT,如 Simple and fast method to compare images for similarity 中所述),或 (2) 考虑在 GIS 中应用空间统计中的 空间相似性比较 算法(有一些关于此的论文,但我不确定是否有一些算法处理简单的点数据而不是具有形状的正常区域数据(以更符合 GIS 的方式,我需要找到一种处理 raster 数据而不是 polygon 数据的算法),或 (3) 考虑直接应用处理离散二维分布的统计方法,我认为这可能有点粗糙(似乎忽略了区域聚类/自相关效应,~托布勒第一地理定律)。

  • 对于方向(1),我在想一个简单的方法,就是先在两张图片中分别找到一些“峰值”区域,并将它们的并集作为ROI,然后具体比较两张图片中的那些ROI一种简单的逐像素方式(将它们一起视为向量),但我不确定是否可以用相关度量替换距离度量,并且有点担心图像处理中的许多相似性比较方法可能不起作用好吧,当两个图像不同时。对于方向(2),我认为这个方向可能更合适,因为这个问题确实和空间统计有关,但我还不知道在GIS中从哪里开始。我猜方向(3)有点被(2)掩盖了,所以我可能不会在这里考虑。

示例

示例图片:(我自己的数据存在一些问题,所以这里我从 SpatialLIBD http://research.libd.org/spatialLIBD/reference/sce_image_grid_gene.html 借用了一张图片)

假设每个像素的值在 0 到 10 之间离散(如果需要,可以缩放到 [0,1])。左右子图中的组织形状有点不同,但在我的情况下它们完全一样。

PS:不过,空间统计存在一个可能很严重的问题。特定细胞类型的某些标记基因的表达可能不会聚集成块状,而是呈薄层状或不规则状。例如,如果网格是大脑的一部分,那么皮质层特异性基因的高表达峰值区域(例如,第五层的 Ctip2)可能会在 10000*10000 的网格中形成一个薄的弧形弯曲层。

更新:我发现了一种属于(3)方向的方法,称为“最佳传输”问题,它可能有用。看起来它将位置信息集成到分布比较中。明天会尝试以这种方式进行测试(似乎是所有三个方向中最容易编码的?)。

任何想法将不胜感激!

【问题讨论】:

    标签: image-processing pattern-matching gis geospatial bioinformatics


    【解决方案1】:

    在没有任何示例图像的情况下,我假设您的问题类似于纹理图案识别。

    我们可以从Local Binary Patterns (2002) 或简称 LBPs 开始。与previous (1973) 纹理特征基于灰度共生矩阵计算纹理的全局表示不同,LBP 通过比较每个像素与其周围的像素邻域来计算纹理的局部表示。对于图像中的每个像素,我们选择围绕中心像素的大小为 r 的邻域(以处理可变的邻域大小)。然后为该中心像素计算 LBP 值,并将其存储在与输入图像具有相同宽度和高度的输出二维数组中。然后您可以计算 LBP 代码的直方图(作为最终特征向量)并应用机器学习进行分类。

    LBP 实现可以在 scikit-image 和 OpenCV 中找到,但后者的实现严格地在人脸识别的上下文中 - 底层 LBP 提取器不暴露于原始 LBP 直方图计算。 LBP 的 scikit-image 实现提供了对您想要生成的 LBP 直方图类型的更多控制。此外,scikit-image 实现还包括改进旋转和灰度不变性的 LBP 变体。

    一些入门代码:

    from skimage import feature
    import numpy as np
    from sklearn.svm import LinearSVC
    from imutils import paths
    import cv2
    import os
    
    class LocalBinaryPatterns:
        def __init__(self, numPoints, radius):
            # store the number of points and radius
            self.numPoints = numPoints
            self.radius = radius
        def describe(self, image, eps=1e-7):
            # compute the Local Binary Pattern representation
            # of the image, and then use the LBP representation
            # to build the histogram of patterns
            lbp = feature.local_binary_pattern(image, self.numPoints,
                self.radius, method="uniform")
            (hist, _) = np.histogram(lbp.ravel(),
                bins=np.arange(0, self.numPoints + 3),
                range=(0, self.numPoints + 2))
            # normalize the histogram
            hist = hist.astype("float")
            hist /= (hist.sum() + eps)
            # return the histogram of Local Binary Patterns
            return hist
    
    # initialize the local binary patterns descriptor along with
    # the data and label lists
    desc = LocalBinaryPatterns(24, 8)
    data = []
    labels = []
    
    # loop over the training images
    for imagePath in paths.list_images(args["training"]):
        # load the image, convert it to grayscale, and describe it
        image = cv2.imread(imagePath)
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        hist = desc.describe(gray)
        # extract the label from the image path, then update the
        # label and data lists
        labels.append(imagePath.split(os.path.sep)[-2])
        data.append(hist)
    
    # train a Linear SVM on the data
    model = LinearSVC(C=100.0, random_state=42)
    model.fit(data, labels)
    

    一旦我们的线性 SVM 被训练,我们就可以使用它来分类后续的纹理图像:

    # loop over the testing images
    for imagePath in paths.list_images(args["testing"]):
        # load the image, convert it to grayscale, describe it,
        # and classify it
        image = cv2.imread(imagePath)
        gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        hist = desc.describe(gray)
        prediction = model.predict(hist.reshape(1, -1))
        
        # display the image and the prediction
        cv2.putText(image, prediction[0], (10, 30), cv2.FONT_HERSHEY_SIMPLEX,
            1.0, (0, 0, 255), 3)
        cv2.imshow("Image", image)
        cv2.waitKey(0)
    

    查看这个出色的tutorial 了解更多详情。

    Ravi Kumar (2016) 能够通过将 LBP 与 Gabor 滤波器相结合来过滤 LBP 模式的系数来提取纹理更精细的图像

    【讨论】:

    • 感谢您的精彩回答!我已经编辑了问题并显示了示例图像。我的问题的一个具体特征是我不关心“旋转”或“缩放(大小)”,我认为这是普通图像比较的重要组成部分。就我而言,旋转相似性不应被视为相似性。我不完全确定 Ojala 等人中描述的算法是否。 (2002) 的论文在简要查看他们的数据后仍然适用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    相关资源
    最近更新 更多