【问题标题】:Flatten image background using OpenCV/Numpy使用 OpenCV/Numpy 展平图像背景
【发布时间】:2015-04-03 20:46:51
【问题描述】:

我正在创建一个图像分析工具(使用 Python)。 我已经有了由 Otsu 阈值处理产生的分段图像。 使用 OpenCv kmeans 函数,我将图像中的颜色数量减少到 4。 K-means 集群之一应该是黑色背景(BGR 值 [0,0,0] )。

由于 K-means 算法,背景像素现在不是 [0,0,0],而是显示例如[0,2,1]。

我希望这个背景集群再次变成绝对黑色。图像表示为 3D numpy 数组。目前我只是在迭代调整背景:

    X, Y, Z = img.shape
    for xi in xrange(X):
        for yi in xrange(Y):
            if all([value < 10 for value in img[xi][yi]]): 
                img[xi][yi] = np.zeros((1,3), dtype=int)

这是一个相对缓慢的操作。有没有更聪明的方法,可能使用专门的 OpenCV/Numpy 函数?

【问题讨论】:

    标签: python image opencv numpy


    【解决方案1】:

    您可以将此操作视为如此:

    In [29]: A = np.random.random_integers(0,10,(2,4,3))
    
    In [30]: A
    Out[30]: 
    array([[[ 5,  9,  1],
            [ 4,  0,  2],
            [ 0,  5,  9],
            [ 8,  7,  8]],
    
           [[ 1,  6,  7],
            [ 8, 10,  9],
            [ 2, 10,  1],
            [ 9,  2,  3]]])
    
    In [32]: np.all(A < 5, axis=-1)  # I chose a threshold of 5
    Out[32]: 
    array([[False,  True, False, False],
           [False, False, False, False]], dtype=bool)
    
    In [33]: A[np.all(A < 5, axis=-1)] = 100  # and set the values to 100 to easily show what has changed
    
    In [34]: A
    Out[34]: 
    array([[[  5,   9,   1],
            [100, 100, 100],
            [  0,   5,   9],
            [  8,   7,   8]],
    
           [[  1,   6,   7],
            [  8,  10,   9],
            [  2,  10,   1],
            [  9,   2,   3]]])
    

    通过指定np.all(some_array, axis=-1)您在最后一个轴上执行all操作,这是RGB值的位置。在此测试阵列中,您认为只有一个这样的像素(在987654324 @)中,那里只有一个这样的像素。

    【讨论】:

    • 这是一个很好的答案,并将我的解决方案指向2行而不是约10.好工作! span>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    相关资源
    最近更新 更多