Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用OpenCV按颜色排列像素_C++_Opencv - Fatal编程技术网

C++ 使用OpenCV按颜色排列像素

C++ 使用OpenCV按颜色排列像素,c++,opencv,C++,Opencv,我开始一个关于探测的项目。 我的想法是对图像的每个像素进行排序(Mat)。 然后,我将能够退出哪个颜色占主导地位 困难在于颜色不是单一的。例如,绿色是rgb(02550),但也几乎是rgb(10240,20) 我排名的目标是退出几乎相同颜色的像素。然后,用喷枪,我想我可以找到我的目标 所以,我的问题是:这是一种按颜色排列像素的方法吗 你的答案需要提前很多时间。没有一种像你所说的颜色像素的直接排序方法。 但是,您可以找到与最主要的近似值 有几种方法可以做到这一点: 您可以计算每个颜色通道的直方图-

我开始一个关于探测的项目。 我的想法是对图像的每个像素进行排序(Mat)。 然后,我将能够退出哪个颜色占主导地位

困难在于颜色不是单一的。例如,绿色是rgb(02550),但也几乎是rgb(10240,20)

我排名的目标是退出几乎相同颜色的像素。然后,用喷枪,我想我可以找到我的目标

所以,我的问题是:这是一种按颜色排列像素的方法吗


你的答案需要提前很多时间。

没有一种像你所说的颜色像素的直接排序方法。 但是,您可以找到与最主要的近似值

有几种方法可以做到这一点:

  • 您可以计算每个颜色通道的直方图-将其转换为R、G、B并计算直方图。然后您可以看到结果图的峰值在哪里-例如
  • 如果k-表示在图像处对像素进行聚类-换句话说,将每个像素表示为具有坐标(R、G、B)的3D点。然后,您可以将像素分割为k种最常见的颜色
  • 如果将图像调整为1x1像素图像,则会找到所有像素值的平均值。如果有一种主色,其中大多数像素都非常接近,它将给出一个很好的近似值
  • 然而,这些都是近似值。最好的选择是使用k-means并找到元素最多或密度最大的簇


    如果您正在寻找一种方法来定位具有特定颜色的对象,您可以使用最大似然估计。卫星图像中用来对不同物体进行分类的东西,如草地、汽车、建筑物和人行道。您可以将其与单一颜色一起使用,并根据属于您的对象的像素的可能性(概率百分比)获得对象所在位置的热图

    在一张普通的图像中,总是会涉及到许多颜色。为了最佳地平均携带几乎相同颜色的像素,通过颜色量化来完成,该量化使用K-均值聚类等技术来减少图像中的颜色数量。这里最好用Python代码来解释这一点:

    成功量化后,您可以尝试以下代码,根据颜色在图像中的频率对颜色进行排序

    top_n_colors = []
    n = 3
    colors_count = {}
    (channel_b, channel_g, channel_r) = cv2.split(_processed_image)
    
    # Flattens the 2D single channel array so as to make it easier to iterate over it
    channel_b = channel_b.flatten()
    channel_g = channel_g.flatten()
    channel_r = channel_r.flatten()
    
    for i in range(len(channel_b)):
        RGB = str(channel_r[i]) + " " + str(channel_g[i]) + " " + str(channel_b[i])
        if RGB in colors_count:
            colors_count[RGB] += 1
        else:
            colors_count[RGB] = 1
    
    # taking the top n colors from the dictionary objects
    _top_colors = sorted(colors_count.items(), key=lambda x: x[1], reverse=True)[0:n]
    for _color in _top_colors:
        _rgb = tuple([int(value) for value in _color[0].split()])
        top_n_colors.append(_rgb)
    
    print(top_n_colors)
    

    第二点是我可以探索的一个很好的方法。Thx 23pointsNorth!我的想法是,有时我需要退出几种颜色(占主导地位)。有可能深化你的观点2吗?我尝试了一些东西,但是太长了(120x75的图片大约7秒)。@Stalyon,我有一些演示,稍后我会用一些小的解释链接它们。不应该花那么多时间。即使对于VGA(640x480),它通常也能很快工作。我对此很感兴趣。你真的想在你的图像中找到一个物体吗?这将是一个好主意,如果你可以显示你的图像…我想找到不同的对象在一个视频。所以我不能真正给你看一幅图像。静止的画面可以告诉我们一些关于物体大小、形状、纹理、颜色、灯光或背景的重要信息……首先是直方图。你需要学习很多。(聚类、图像分割、目标检测、跟踪等)@William:我试过使用直方图,但这并不完全是我想要的。我继续使用下面23PointsNorth提出的解决方案2。