计算OpenCV中图像的颜色分布

时间:2016-07-30 18:26:33

标签: opencv colors distribution

假设我们有一张灰度图像。有没有办法计算非黑色像素的分布方式,即它们是在一个还是几个地方分组,还是在整个图像中均匀分布?

3 个答案:

答案 0 :(得分:0)

听起来像是在寻找图像的直方图。这是图像处理的基本操作。

收集直方图,将数据组织成一组预定义的分箱。

使用OpenCV进行直方图计算的文档在this link

答案 1 :(得分:0)

听起来你正在寻找的是你的图像光栅化版本的空间时刻。

首先,您需要对图像进行阈值处理以使其成为二进制: http://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html?highlight=threshold#threshold

然后您可以计算图像时刻: http://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=moments#moments

如果你想要一个空间矩的物理类比,你可以想象每个白色像素是一个单位点质量,那么第二个时刻就是图像的转动惯量。如果白色像素(点质量)紧密聚集,则第二个时刻将很低(图像将很容易旋转)。

答案 2 :(得分:0)

我想分享我用过的另一种方法。

Mat img = imread(argv[1], CV_LOAD_IMAGE_COLOR);
cvtColor(img, img, CV_RGB2GRAY);
threshold(img, img, 35, 255, THRESH_BINARY);

Mat distance;
distanceTransform(img, distance, CV_DIST_L2, 3);
distance = min(distance, 1);
Scalar distribution = mean(dist);

cout <<  "The distribution is: " << distribution << std::endl;

棘手的部分是distanceTransformmin功能的组合。对于分布良好的图像,min函数的影响会更小,平均值会更大。