如何计算轮廓内像素的黑白比率

时间:2019-03-25 15:19:52

标签: c++ opencv

如何计算轮廓(不是边界框)轮廓内像素的黑白比率?

使用cv::threshold(src, img, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);预处理图像,然后img = 255 - img;反转图像

我通过cv::RETR_EXTERNAL寻找表格(轮廓)的矩形轮廓。我想计算轮廓内的黑色像素

图像中可能还有其他成分,所以我不能只计算所有非零像素

这是二值化和反转之前的原始图像

enter image description here

2 个答案:

答案 0 :(得分:1)

您不能计算轮廓的黑白比率,因为轮廓是什么?一组相互连接的白色像素,彼此称为轮廓,因此轮廓不包含任何黑色像素(如果包含),则称为轮廓内部的孔。

轮廓也没有特定的形状。

因此,您可以通过Bounding Rectangle围绕轮廓的矩形进行操作,然后将要计算矩形内部的黑白比率。

enter image description here

答案 1 :(得分:1)

我认为术语方面有些混乱。轮廓只是点的序列。如果将它们绘制为封闭的多边形(例如,用cv::drawContours绘制),则多边形内的所有点都将为 white

不过,您可以使用此蒙版来计算阈值图像上的白色或黑色像素:

cv::Mat1b bw_image = ...

std::vector<std::vector<cv::Point>> contours;
cv::findContours(bw_image, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);

for(size_t i=0; i<contours.size(); ++i)
{
    cv::Mat1b contour_mask(bw_image.rows, bw_image.cols, uchar(0));
    cv::drawContours(contour_mask, contours, i, Scalar(255), cv::FILLED);

    int total_white_inside_contour = cv::countNonZero(mask);
    int white_on_image_inside_contour = cv::countNonZero(bw_image & mask);
    int black_on_image_inside_contour = total_white_inside_contour - white_on_image_inside_contour;
}