如何将图像中选定的矩形转换为灰度?

How to convert the selected rectangle from the image into 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);

我正在使用 rectangle 函数绘制矩形。 有没有关于如何将矩形中的图像转换为灰度的建议?

如果颜色 space 是 RGB,您需要对红色、绿色和蓝色取平均值,并将平均值写入所有三个样本。每个表面类型都需要一个函数。

假设示例顺序为 RGBRGBRGB...

unsigned char* pLine = image[i]; // pointer to start of line 'i'
for (int j=0; i < width; ++j) { // width is pixels per line
   int gray = ((pLine[j*3] + pLine[j*3 + 1] + pLine[j*2]) + 1) / 3;
   pLine[j*3] = pLine[j*3 + 1] = pLine[j*2]= (unsigned char)gray;
}

如果颜色 space 是 YCbCr/YUV,您需要将 128 写入所有 Cb/Cr 或 UV 样本,保持 'Y' 不变。 'Y'为灰度级。

如果你想更好地计算灰度级,你可以使用与RGB->YUV转换中使用的公式类似的公式。 70% 绿色、20% 红色和 10% 蓝色。

您可以:

  1. 用给定的矩形裁剪 3 通道图像
  2. 将裁剪后的图像转换为灰度图像。结果将是单通道图像
  3. 将灰度图转换为3通道,否则无法复制到原图
  4. 将 3 通道灰度图像复制到原始图像中。

结果(2 roi 的示例):

代码:

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