如何找到图像像素值的模式(统计数据)?

时间:2017-05-06 22:48:58

标签: opencv numpy scipy

我使用opencv,我可以通过下面的代码获取图像的像素 - 一个三维元组。但是,我不太清楚如何计算图像中像素值的模式。

JPanel

我试过了,

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

import numpy as np
import cv2


img =cv2.imread('C:\\Users\Moondra\ABEO.png')

#px = img[100,100]  #gets pixel value
#print (px)

但是这会返回

的数组形状
from scipy import stats
stats.mode(img)[0]

不确定stats.mode(img)[0].shape (1, 800, 3) 究竟是如何计算选择模式的尺寸,但我希望每个像素值(3维元组)都是一个元素。

编辑: 为清楚起见,我将准确列出我正在寻找的内容。 让我们说我们有一个形状(3,5,3)的数组,看起来像这样

stats

然后我会将它转换为一个看似这样的数组,以便于计算

将其转为

array([[[1, 1, 2],    #[1,1,2] = represents the RGB values
        [2, 2, 2],
        [1, 2, 2],
        [2, 1, 1],
        [1, 2, 2]],

       [[1, 2, 2],
        [2, 2, 2],
        [2, 2, 2],
        [1, 2, 2],
        [1, 2, 1]],

       [[2, 2, 1],
        [2, 2, 1],
        [1, 1, 2],
        [2, 1, 2],
        [1, 1, 2]]])

我想通过计算每组RGB来计算模式,如下所示:

array([[1, 1, 2],
         [2, 2, 2],
         [1, 2, 2],
        [2, 1, 1],
        [1, 2, 2],

       [1, 2, 2],
        [2, 2, 2],
        [2, 2, 2],
        [1, 2, 2],
        [1, 2, 1],

       [2, 2, 1],
        [2, 2, 1],
        [1, 1, 2],
        [2, 1, 2],
        [1, 1, 2]])


which is of shape(15,3)

谢谢。

1 个答案:

答案 0 :(得分:2)

根据描述,您似乎是在输入图像中出现最多的像素之后。为了解决同样的问题,这是一种使用views -

概念的有效方法
def get_row_view(a):
    void_dt = np.dtype((np.void, a.dtype.itemsize * np.prod(a.shape[-1])))
    a = np.ascontiguousarray(a)
    return a.reshape(-1, a.shape[-1]).view(void_dt).ravel()

def get_mode(img):
    unq, idx, count = np.unique(get_row_view(img), return_index=1, return_counts=1)
    return img.reshape(-1,img.shape[-1])[idx[count.argmax()]]

示例运行 -

In [69]: img = np.random.randint(0,255,(4,5,3))

In [70]: img.reshape(-1,3)[np.random.choice(20,10,replace=0)] = 120

In [71]: img
Out[71]: 
array([[[120, 120, 120],
        [ 79, 105, 218],
        [ 16,  55, 239],
        [120, 120, 120],
        [239,  95, 209]],

       [[241,  18, 221],
        [202, 185, 142],
        [  7,  47, 161],
        [120, 120, 120],
        [120, 120, 120]],

       [[120, 120, 120],
        [ 62,  41, 157],
        [120, 120, 120],
        [120, 120, 120],
        [120, 120, 120]],

       [[120, 120, 120],
        [  0, 107,  34],
        [  9,  83, 183],
        [120, 120, 120],
        [ 43, 121, 154]]])

In [74]: get_mode(img)
Out[74]: array([120, 120, 120])