在 C++ 中将 RGB 更改为 GrayScale
Change RGB to GrayScale in c++
我正在尝试使用平均法将 RGB 图像转换为灰度图像。但是 get 的输出与所需的输出不同。我正在拍摄图像并获取 rgb 值。我执行平均操作并存储平均和另一个相同大小的图像数组。最后我将数组转换为 Mat 并显示图像。
输入图像:
期望的输出:
我的输出:
int main()
{
Mat image;
image =imread("<image_path>");
int rows=image.rows;
int cols=image.cols;
int myArray[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
myArray[i][j] = 0;
}
}
uint8_t* pixelPtr = (uint8_t*)image.data;
int cn = image.channels();
Scalar_<uint8_t> bgrPixel;
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
bgrPixel.val[0] = pixelPtr[i*image.cols*cn + j*cn + 0]; // B
bgrPixel.val[1] = pixelPtr[i*image.cols*cn + j*cn + 1]; // G
bgrPixel.val[2] = pixelPtr[i*image.cols*cn + j*cn + 2]; // R
int average = (bgrPixel.val[0]+bgrPixel.val[1]+bgrPixel.val[2])/3;
myArray[i][j]=average;
}
}
Mat averaged_image(Size(rows, cols), CV_8UC3, myArray, Mat::AUTO_STEP);
imwrite("<path to save the image>",averaged_image);
imshow("averaged_image",averaged_image);
waitKey(0);
return 0;
}
创建时Mat averaged_image
,
Mat averaged_image(Size(rows, cols), CV_8UC3, myArray, Mat::AUTO_STEP);
您需要使用 CV_32S
而不是 CV_8UC3
因为您的数组元素不是三个字符,而是一个 32 位整数。
您还可以使用函数 cvtColor
:
cv::Mat gray;
cv::cvtColor(image, gray, CV_BGR2GRAY);
奖励:此函数可以正确加权通道,因为简单的平均可能不是正确的做法。
我正在尝试使用平均法将 RGB 图像转换为灰度图像。但是 get 的输出与所需的输出不同。我正在拍摄图像并获取 rgb 值。我执行平均操作并存储平均和另一个相同大小的图像数组。最后我将数组转换为 Mat 并显示图像。
输入图像:
期望的输出:
我的输出:
int main()
{
Mat image;
image =imread("<image_path>");
int rows=image.rows;
int cols=image.cols;
int myArray[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
myArray[i][j] = 0;
}
}
uint8_t* pixelPtr = (uint8_t*)image.data;
int cn = image.channels();
Scalar_<uint8_t> bgrPixel;
for(int i = 0; i < rows; i++)
{
for(int j = 0; j < cols; j++)
{
bgrPixel.val[0] = pixelPtr[i*image.cols*cn + j*cn + 0]; // B
bgrPixel.val[1] = pixelPtr[i*image.cols*cn + j*cn + 1]; // G
bgrPixel.val[2] = pixelPtr[i*image.cols*cn + j*cn + 2]; // R
int average = (bgrPixel.val[0]+bgrPixel.val[1]+bgrPixel.val[2])/3;
myArray[i][j]=average;
}
}
Mat averaged_image(Size(rows, cols), CV_8UC3, myArray, Mat::AUTO_STEP);
imwrite("<path to save the image>",averaged_image);
imshow("averaged_image",averaged_image);
waitKey(0);
return 0;
}
创建时Mat averaged_image
,
Mat averaged_image(Size(rows, cols), CV_8UC3, myArray, Mat::AUTO_STEP);
您需要使用 CV_32S
而不是 CV_8UC3
因为您的数组元素不是三个字符,而是一个 32 位整数。
您还可以使用函数 cvtColor
:
cv::Mat gray;
cv::cvtColor(image, gray, CV_BGR2GRAY);
奖励:此函数可以正确加权通道,因为简单的平均可能不是正确的做法。