如何将图像中选定的矩形转换为灰度?
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% 蓝色。
您可以:
- 用给定的矩形裁剪 3 通道图像
- 将裁剪后的图像转换为灰度图像。结果将是单通道图像
- 将灰度图转换为3通道,否则无法复制到原图
- 将 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;
}
我需要一个如何将矩形图像转换为灰度图像的建议。
我想将管周围的矩形转换为灰度:
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% 蓝色。
您可以:
- 用给定的矩形裁剪 3 通道图像
- 将裁剪后的图像转换为灰度图像。结果将是单通道图像
- 将灰度图转换为3通道,否则无法复制到原图
- 将 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;
}