当前位置: 首页 > 面试题库 >

使用Python的2d数组(图像)中的像素邻居

柳逸春
2023-03-14
问题内容

我有一个像这样的numpy数组:

x = np.array([[1,2,3],[4,5,6],[7,8,9]])

我需要创建一个函数,并使用以下输入参数将其称为“邻居”:

  • x:numpy 2d数组
  • (i,j):二维数组中元素的索引
  • d:邻域半径

作为输出,我想获得i,j给定距离的单元格的邻居d。所以如果我跑步

neighbors(im, i, j, d=1) with i = 1 and j = 1 (element value = 5)

我应该获取以下值的索引:[1,2,3,4,6,7,8,9]。我希望我说清楚。是否有像scipy这样的库来处理这个问题?

我已经做了一些工作,但这是一个粗略的解决方案。

def pixel_neighbours(self, p):

    rows, cols = self.im.shape

    i, j = p[0], p[1]

    rmin = i - 1 if i - 1 >= 0 else 0
    rmax = i + 1 if i + 1 < rows else i

    cmin = j - 1 if j - 1 >= 0 else 0
    cmax = j + 1 if j + 1 < cols else j

    neighbours = []

    for x in xrange(rmin, rmax + 1):
        for y in xrange(cmin, cmax + 1):
            neighbours.append([x, y])
    neighbours.remove([p[0], p[1]])

    return neighbours

我该如何改善?


问题答案:

编辑 :啊废话,我的答案只是写作,im[i-d:i+d+1, j-d:j+d+1].flatten()但以一种不可理解的方式写:)

好的旧滑动窗口技巧可能会在这里有所帮助:

import numpy as np
from numpy.lib.stride_tricks import as_strided

def sliding_window(arr, window_size):
    """ Construct a sliding window view of the array"""
    arr = np.asarray(arr)
    window_size = int(window_size)
    if arr.ndim != 2:
        raise ValueError("need 2-D input")
    if not (window_size > 0):
        raise ValueError("need a positive window size")
    shape = (arr.shape[0] - window_size + 1,
             arr.shape[1] - window_size + 1,
             window_size, window_size)
    if shape[0] <= 0:
        shape = (1, shape[1], arr.shape[0], shape[3])
    if shape[1] <= 0:
        shape = (shape[0], 1, shape[2], arr.shape[1])
    strides = (arr.shape[1]*arr.itemsize, arr.itemsize,
               arr.shape[1]*arr.itemsize, arr.itemsize)
    return as_strided(arr, shape=shape, strides=strides)

def cell_neighbors(arr, i, j, d):
    """Return d-th neighbors of cell (i, j)"""
    w = sliding_window(arr, 2*d+1)

    ix = np.clip(i - d, 0, w.shape[0]-1)
    jx = np.clip(j - d, 0, w.shape[1]-1)

    i0 = max(0, i - d - ix)
    j0 = max(0, j - d - jx)
    i1 = w.shape[2] - max(0, d - i + ix)
    j1 = w.shape[3] - max(0, d - j + jx)

    return w[ix, jx][i0:i1,j0:j1].ravel()

x = np.arange(8*8).reshape(8, 8)
print x

for d in [1, 2]:
    for p in [(0,0), (0,1), (6,6), (8,8)]:
        print "-- d=%d, %r" % (d, p)
        print cell_neighbors(x, p[0], p[1], d=d)

这里没有进行任何计时,但是此版本可能具有合理的性能。

有关更多信息,请用短语“ rolling window numpy”或“ sliding window numpy”搜索网络。



 类似资料:
  • 问题内容: 我在Python中具有以下测试代码以读取,设置阈值和显示图像: 我想计算带有特定标签(例如黑色)的图像内像素的数量。我怎样才能做到这一点 ?我看了OpenCV的教程,但没有找到任何帮助:-( 谢谢! 问题答案: 对于黑色图像,您将获得像素总数(行*列),然后从得出的结果中减去它。 对于其他值,您可以创建一个遮罩,该遮罩用于返回显示所需颜色/标签/值的所有位置的二进制遮罩,然后用于计算其

  • 我想获得图像中的所有像素,像素值最接近图像中的某些像素。例如,我有一个图像,它有海洋(深蓝色),晴空(浅蓝色),海滩和房屋的观点。我想找到所有最接近深蓝的像素,以便将它归类为水。我的问题是天空也被归类为水。有人建议使用K近邻算法,但网上很少有使用旧C样式的例子。谁能给我提供使用OpenCv C++的K-NN的例子吗?

  • 问题内容: 我正在寻找从中获取像素数据(以表格形式)的最快方法。我的目标是能够解决像素从使用图像。我发现的所有方法均不执行此操作(大多数方法都返回)。 问题答案: 我只是在玩同一个主题,这是访问像素的最快方法。我目前知道执行此操作的两种方法: 使用的答案中所述的BufferedImage 方法。 通过直接使用以下方式访问像素数组: 如果你要处理大图像并且性能是一个问题,则第一种方法绝对不是可行的方

  • 问题内容: 我打算在窗口内显示28x28像素的图像。像素的值为“ 0”,因此我希望它显示一个带有28x28黑色正方形的窗口。但是没有图像显示。也许数组的数据(我不确定像素值是否必须为0到255之间的整数)必须是其他数据才能显示图像。谢谢! 公共课程ASD { 问题答案: 返回栅格的 副本 。也许如果在修改栅格后调用,您将看到结果。 同样,应该给setPixels一个足够大的数组,以填充栅格的所有波

  • 我已经完成了learnopengl突破系列中的几个教程。com,所以我有一个非常简单的2D渲染器。不过,我想给它添加一个子图像功能,在这里我可以为一种“源矩形”指定一个vec4,因此如果vec4是,它将只渲染一个宽度和高度为32的10,10的矩形,有点像SDL渲染器的工作方式。 渲染器的设置方式是所有精灵都使用一个包含纹理坐标的四边形VAO。起初,我认为我可以为每个精灵使用一个VAO数组,每个都有

  • 我一直在写一个文本检测代码,我正在使用一个二进制映射作为一个掩码来处理图像。在获得候选文本区域之后,我在图像上应用函数,然后在图像上应用掩码以获得这些区域的位置。 现在我创建了一个循环来丢弃不满足某些“子句”的区域。如果没有,我将该区域中的所有像素设为0()和二进制映射()。 当我在进入循环之前绘制地图和图像时,它们符合,但之后它们就不符合了。当我在循环后绘制图像时,显示它完美地擦除了区域,但地图