假设我们有一个灰度图像。有没有一种方法可以计算非黑色像素的分布,即它们是在一个或几个地方分组,还是在整个图像中均匀分布?
听起来像是在寻找图像的直方图。它是图像处理中的一项基本操作。
"直方图是收集的数据计数,组织到一组预定义的存储箱中。"
使用OpenCV计算直方图的文档在这个链接中
听起来你要寻找的是图像光栅化版本的空间时刻。
首先,您需要对图像设置阈值,使其二进制化: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
如果你想对空间矩进行物理类比,你可以想象每个白色像素都是一个单位点质量,那么第二个矩就是图像的转动惯量。如果白色像素(点质量)是紧密聚集的,那么第二矩将是低的(图像将容易旋转)。
我想分享我使用的另一种方法。
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;
棘手的部分是distance Transform和min函数的组合。最小函数对分布良好的图像的影响较小,平均值较大。