【问题标题】:How to calculate the black / white ratio of pixels inside a contour如何计算轮廓内像素的黑白比
【发布时间】:2019-03-26 00:08:16
【问题描述】:

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

图片经过cv::threshold(src, img, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);预处理,再反转img = 255 - img;

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

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

这是二值化和倒置前的原图

【问题讨论】:

  • 您能否准确地说“轮廓的黑白比例”是什么意思?在图像处理中,轮廓通常由 1 像素宽的曲线定义,这让我对这个问题感到困惑。
  • 我不是 openCV 方面的专家,所以我可能不会 100% 正确。但我需要计算轮廓内黑白像素的比率
  • 轮廓被定义为白色像素。白色像素 = 轮廓,黑色像素 = 无轮廓。所以我还是很困惑。你有一个可视化的例子来说明你称之为黑白像素的轮廓吗?所以也许我们可以就词汇达成一致,看看我能不能帮你:)
  • 好的,如果我说我想将轮廓曲线内的所有像素复制到蒙版中怎么办?
  • 使用cv::drawContours 创建一个厚度为cv::FILLED 的蒙版,然后将cv::countNonZero 与蒙版一起使用(以及反转的蒙版)

标签: c++ opencv


【解决方案1】:

我认为术语有些混乱。轮廓只是一系列点。如果将它们绘制为闭合多边形(例如使用cv::drawContours),则多边形内的所有点都将是白色

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

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;
}

【讨论】:

    【解决方案2】:

    你无法计算轮廓的黑白比例,因为什么是轮廓?一组相互连接的白色像素称为轮廓,因此轮廓不包含任何黑色像素,如果包含任何黑色像素,则称为轮廓内部的孔。

    而且轮廓也没有特定的形状。

    所以你可以通过Bounding Rectangle轮廓周围的矩形来完成,然后你将计算矩形内的黑白比例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2023-03-21
      • 2012-07-04
      • 1970-01-01
      相关资源
      最近更新 更多