C++ 使用OpenCV按颜色排列像素
我开始一个关于探测的项目。 我的想法是对图像的每个像素进行排序(Mat)。 然后,我将能够退出哪个颜色占主导地位 困难在于颜色不是单一的。例如,绿色是rgb(02550),但也几乎是rgb(10240,20) 我排名的目标是退出几乎相同颜色的像素。然后,用喷枪,我想我可以找到我的目标 所以,我的问题是:这是一种按颜色排列像素的方法吗C++ 使用OpenCV按颜色排列像素,c++,opencv,C++,Opencv,我开始一个关于探测的项目。 我的想法是对图像的每个像素进行排序(Mat)。 然后,我将能够退出哪个颜色占主导地位 困难在于颜色不是单一的。例如,绿色是rgb(02550),但也几乎是rgb(10240,20) 我排名的目标是退出几乎相同颜色的像素。然后,用喷枪,我想我可以找到我的目标 所以,我的问题是:这是一种按颜色排列像素的方法吗 你的答案需要提前很多时间。没有一种像你所说的颜色像素的直接排序方法。 但是,您可以找到与最主要的近似值 有几种方法可以做到这一点: 您可以计算每个颜色通道的直方图-
你的答案需要提前很多时间。没有一种像你所说的颜色像素的直接排序方法。 但是,您可以找到与最主要的近似值 有几种方法可以做到这一点:
如果您正在寻找一种方法来定位具有特定颜色的对象,您可以使用最大似然估计。卫星图像中用来对不同物体进行分类的东西,如草地、汽车、建筑物和人行道。您可以将其与单一颜色一起使用,并根据属于您的对象的像素的可能性(概率百分比)获得对象所在位置的热图 在一张普通的图像中,总是会涉及到许多颜色。为了最佳地平均携带几乎相同颜色的像素,通过颜色量化来完成,该量化使用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。