Python 如何找到最频繁的像素值?

Python 如何找到最频繁的像素值?,python,image,image-processing,computer-vision,Python,Image,Image Processing,Computer Vision,我有一组图像,其中每个像素由0-255范围内的3个整数组成 我感兴趣的是找到一个对整个像素群具有“代表性”(尽可能多)的像素,并且该像素必须出现在像素群中。 我正在确定哪一个像素是我的一组图像中最常见的(中间模式)最有意义 我正在使用python,但我不知道该怎么做。 图像存储为numpy数组,尺寸[n,h,w,c],其中n是图像的数量,h是高度,w是宽度,c`是通道(RGB)。我假设您需要找到最常见的元素,正如Cris Luengo提到的,这被称为模式。我还将假设通道的位深度为8位(值介于0和

我有一组图像,其中每个像素由0-255范围内的3个整数组成

我感兴趣的是找到一个对整个像素群具有“代表性”(尽可能多)的像素,并且该像素必须出现在像素群中。 我正在确定哪一个像素是我的一组图像中最常见的(中间模式)最有意义

我正在使用
python
,但我不知道该怎么做。
图像存储为
numpy数组
,尺寸
[n,h,w,c]
,其中
n
是图像的数量,
h
是高度,
w
是宽度
c`是通道(RGB)。

我假设您需要找到最常见的元素,正如Cris Luengo提到的,这被称为模式。我还将假设通道的位深度为8位(值介于0和255之间,即模256)

以下是一种独立于实现的方法:

其目的是保持遇到的所有不同种类像素的计数。为此使用字典是有意义的,它的形式是
{pixel\u value:count}

填充此字典后,我们可以找到计数最高的像素

现在,“像素”是不可散列的,因此不能直接存储在字典中。我们需要一种方法来为每个唯一的像素分配一个整数(我称之为像素值),也就是说,您应该能够转换像素的像素值RGB值

此函数用于将RGB值转换为0到16777215之间的整数:

def get_pixel_value(pixel):
    return pixel.red + 256*pixel.green + 256*256*pixel.blue 
以及将像素_值转换回RGB值:

def get_rgb_values(pixel_value):
    red = pixel_value%256
    pixel_value //= 256
    green = pixel_value%256
    pixel_value //= 256
    blue = pixel_value
    return [red,green,blue]
此功能可以查找图像中最常见的像素:

def find_most_common_pixel(image):
    histogram = {}  #Dictionary keeps count of different kinds of pixels in image

    for pixel in image:
        pixel_val = get_pixel_value(pixel)
        if pixel_val in histogram:
            histogram[pixel_val] += 1 #Increment count
        else:
            histogram[pixel_val] = 1 #pixel_val encountered for the first time

    mode_pixel_val = max(histogram, key = histogram.get) #Find pixel_val whose count is maximum
    return get_rgb_values(mode_pixel_val)  #Returna a list containing RGB Value of the median pixel

如果您希望在一组图像中查找最频繁的像素,只需为图像集中的图像添加另一个循环
,并为所有图像中的所有像素值填充字典。

您的像素数据是如何表示的?数组的数组的数组?(行x列x RGB值?)我已经用数据描述更新了帖子。中位数不是最常见的,这将是模式。中位数是排序后正好在列表中间的一个。因此,它本质上是一维属性。您拥有3D数据(每像素3个值意味着像素生活在3D世界中)。你可以尝试向量中值,它是中值概念的多个维度的扩展,但它在多个维度上都不是真正的中值。我认为你需要找到图像的直方图/pdf。将三个字节(0-255)放在一个整数中,如下所示
pixel=(r@user8190410:需要计算一个非常大的直方图!:)最后,我想指出的是,找到最大图像段的平均RGB值可能比找到一个最常见的值更有意义。仔细研究,看看这是否更适合您的应用程序。你还应该考虑到图像分割消耗了更多的资源。我非常想要这个特定的应用程序的模式(感谢修正),它不会像这样的模式那样对噪声敏感。我喜欢分割方法,但您也可以考虑一些边缘保持平滑(例如双边过滤器),以确保具有相似值的相邻像素成为具有相同值的像素,从而有助于相同的字典条目,并有机会建立更高的峰值。像素值的某种形式的离散化也是可能的。这是一个很好的观点,但这些图像不是自然图像,所以不需要担心。我不太明白分割的方法——我只对找到一个像素感兴趣,这个像素对于整个像素群来说是“代表性的”(尽可能多),并且这个像素必须出现在像素群中