Search code examples
c++opencvroi

How to convert the selected rectangle from the image into grayscale?


I need a suggestion how to convert the image in rectangle into a grayscale image.

I want to convert the rectangle around the tube to grayscale:

for (int i = 612; i >= 0; i = i-204)
{
    cout << "i" << i << endl;

    rectangle( OI, Rect(i, 0, 161, 643),  1, 2, 8, 0 );
}   

imshow("Display window",OI);

I am using rectangle function to draw rectangle. Are there any suggestions for how can I convert the image in the rectangle into grayscale?


Solution

  • You can:

    1. Crop the 3 channel image with a given rectangle
    2. Convert the cropped image to grayscale. The result will be a single channel image
    3. Convert the grayscale image to 3 channels, or you can't copy it into the original image
    4. Copy the 3 channel grayscale image into the original image.

    Result (example with 2 roi):

    enter image description here

    Code:

    #include <opencv2\opencv.hpp>
    using namespace cv;
    
    int main()
    {
        // Your image
        Mat3b img = imread("path_to_image");
    
        // Your rects
        vector<Rect> rois{ Rect(50, 50, 200, 300), Rect(400, 100, 200, 380) };
    
        for (int i = 0; i < rois.size(); ++i)
        {
            // Convert each roi to grayscale
            Mat crop = img(rois[i]).clone();      // Crop is color CV_8UC3
            cvtColor(crop, crop, COLOR_BGR2GRAY); // Now crop is grayscale CV_8UC1
            cvtColor(crop, crop, COLOR_GRAY2BGR); // Now crop is grayscale, CV_8UC3
            crop.copyTo(img(rois[i]));            // Copy grayscale CV_8UC3 into color image
        }
    
        // Show results
        imshow("Result", img);
        waitKey();
    
        return 0;
    }