我如何找到图像像素值的模式(统计)? [英] How would I find the mode (stats) of pixel values of an image?

查看:76
本文介绍了我如何找到图像像素值的模式(统计)?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 opencv 并且我能够通过下面的代码获得图像的一个像素 - 一个 3 维元组.但是,我不太确定如何计算图像中像素值的模式.

I'm using opencv and I'm able to get a pixel of an image-- a 3-dimensional tuple, via the code below. However, I'm not quite sure how to calculate the mode of the pixels values in the image.

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]

但这会返回一个数组形状

But this returns an array shape of

stats.mode(img)[0].shape
(1, 800, 3)

不确定 stats 究竟如何计算从中选择模式的维度,但我正在寻找每个像素值(3 维元组)作为一个元素.

Not sure how exactly stats is calculating the dimensions from which to choose the mode, but I'm looking for each pixel value (3 dimensional tuple) to be one element.

为了清楚起见,我将准确地列出我正在寻找的内容.假设我们有一个形状为 (3,5,3) 的数组,看起来像这样

For clarity, I'm going to lay out exactly what I'm looking for. Let's say we have an array that is of shape (3,5,3) and looks like this

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]]])

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

I would then convert it to an array that looks like this for easier calculation

把它变成

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)

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

I would like to calculate the mode by counting each set of RGB as follows:

 [1,1,2] = 3
 [2,2,2] = 4  
[1,2,2] = 4
[2,1,1] = 2
[1,1,2] =1

谢谢.

推荐答案

从描述来看,您似乎在寻找输入图像中出现次数最多的像素.为了解决同样的问题,这里有一种使用 views -

From the description, it seems you are after the pixel that's occurring the most in the input image. To solve for the same, here's one efficient approach using the concept of 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()]]

我们也可以使用 np.unique 及其 axis 参数,就像这样 -

We can also make use of np.unique with its axis argument, like so -

def get_mode(img):
    unq,count = np.unique(img.reshape(-1,img.shape[-1]), axis=0, return_counts=True)
    return unq[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])

这篇关于我如何找到图像像素值的模式(统计)?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆