【问题标题】:How to find most frequent pixel value?如何找到最频繁的像素值?
【发布时间】:2018-10-04 01:27:22
【问题描述】:

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

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

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

【问题讨论】:

  • 您的像素数据是如何表示的?一个数组数组数组? (行 x 列 x rgbvalues ?)
  • 我已经用数据描述更新了帖子
  • 中位数不是最常见的,那将是众数。中位数是排序后正好位于列表中间的那个。因此,它本质上是一维属性。您有 3D 数据(每个像素 3 个值表示像素存在于 3D 世界中)。您可以尝试向量中位数,它是对中位数概念的多维扩展,但它绝不是超过一维的真正中位数。
  • 我认为您需要找到图像的直方图/pdf。把这三个字节(0-255)放在一个像pixel = (r << 16) | (g << 8) | b这样的整数中,然后求图像的概率密度函数
  • @user8190410:你需要计算一个非常大的直方图! :)

标签: python image image-processing computer-vision


【解决方案1】:

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

这是一个独立于实现的方法:

目的是保持对遇到的所有不同类型像素的计数。为此使用字典是有意义的,其格式为{pixel_value : count}

一旦这个字典被填充,我们就可以找到计数最高的像素。

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

此函数将 RGB 值转换为 0 到 16,777,215 范围内的整数:

def get_pixel_value(pixel):
    return pixel.red + 256*pixel.green + 256*256*pixel.blue 

并将 pixel_value 转换回 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

如果您希望在一组图像中找到最频繁的像素,只需添加另一个循环 for image in image_set 并为所有图像中的所有 pixel_values 填充字典。

【讨论】:

  • 最后,我想提一下,找到最大图像片段的平均 RGB 值可能比找到一个最常见的值更有意义。查看image segmentation, specifically clustering,看看它是否更适合您的应用程序。您还应该考虑到图像分割会消耗更多资源。
  • 我非常特别想要这个特定应用程序的模式(感谢更正) - 它不是这样的集群
  • 该模式对噪音非常敏感。我喜欢分割方法,但您也可以考虑一些边缘保持平滑(例如双边滤波器),以确保具有相似值的相邻像素成为具有相同值的像素,因此有助于相同的字典条目并有机会筑起更高的高峰。像素值的某种形式的离散化也是可能的。
  • 这很好,但这些图像不是自然图像,所以不用担心。我不太了解分割方法 - 我只对找到一个像素对整个像素群作为一个整体“具有代表性”(尽可能)感兴趣,并且该像素必须出现在像素群中
猜你喜欢
  • 2021-01-13
  • 2016-07-05
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
相关资源
最近更新 更多