如何计算轮廓(不是边界框)轮廓内像素的黑白比率?
使用cv::threshold(src, img, 0, 255, cv::THRESH_BINARY | cv::THRESH_OTSU);
预处理图像,然后img = 255 - img;
反转图像
我通过cv::RETR_EXTERNAL
寻找表格(轮廓)的矩形轮廓。我想计算轮廓内的黑色像素
图像中可能还有其他成分,所以我不能只计算所有非零像素
这是二值化和反转之前的原始图像
答案 0 :(得分:1)
您不能计算轮廓的黑白比率,因为轮廓是什么?一组相互连接的白色像素,彼此称为轮廓,因此轮廓不包含任何黑色像素(如果包含),则称为轮廓内部的孔。
轮廓也没有特定的形状。
因此,您可以通过Bounding Rectangle围绕轮廓的矩形进行操作,然后将要计算矩形内部的黑白比率。
答案 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;
}