【问题标题】:How to change color of Rect within an image if it contains a certain value如果图像包含某个值,如何更改图像中 Rect 的颜色
【发布时间】:2021-04-06 06:12:10
【问题描述】:

我的图像上有几个 ROI。对于每个 ROI,如果它包含一个黑色像素,我想将整个 ROI 着色为黑色。到目前为止,这是我的代码:

 int j = 0;
        // this loop sets the ROI rows
        while (j < 10) {
            // this loop sets the ROI columns
            for (int i=0; i<width-1; i+=mini_box_width){
                if (width-i >= mini_box_width){
                // define the Rect, i iterating horizontally
                Rect minibox = Rect(x+i, y, mini_box_height, mini_box_width);

                // Mat minibox_image = frameRGB(minibox);
                // Mat dst;
                // inRange(minibox_image, Scalar(255,255,255), Scalar(255,255,255), dst);

                // plot ROIs
                rectangle(frameRGB, minibox, GREEN);
                // save minibox Rect values in vector
                miniROIs.push_back(minibox);
                }
            }   
        // iterate vertically
        y += mini_box_height;
        j++;
        }

我想它与 inRange 函数有关,如果图像在我指定的范围内,它可以制作一个遮罩,但我如何将它应用于原始图像上 ROI 中的像素?

例如,看这张图片:

图像被分割成几个 ROI。对于图像中的每个 ROI,如果找到黑色像素,我想在原始图像上将该 ROI 中的所有像素涂黑。它应该是这样的:

【问题讨论】:

    标签: c++ image opencv image-processing computer-vision


    【解决方案1】:

    您可以使用您的Rect minibox 选择图像的一个区域,方法是调用您的图像与矩形:即region = frameRGB(minibox),请参阅docs for Mat::operator()(const Rect&amp; roi)

    然后您可以使用cv::countNonZero(region == cv::Scalar(0, 0, 0)) (docs) 检查您所在区域内是否有黑色像素。如果有黑色像素,您可以将区域中的所有像素设置为黑色,只需分配零即可,例如 roi = 0

    【讨论】:

    • 谢谢。我现在了解 countNonZero 函数,这很有帮助。但是,如何在原始图像上叠加设置后置 ROI?
    • @connor449 我认为分配给 roi 就足够了。当您获取一个区域时,您不会创建值的副本,只是获取数据的新标头,因此分配应该改变原始数据。
    猜你喜欢
    • 2013-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 2011-08-20
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多