一、原理
对于图像由彩色图转化为灰度图有三种方法
分别为 加权法 均值法 最大值法
1.加权法就是 Gray=0.3R+0.59G+0.11*B
2.均值法就是 Gray=(R+G+B)/3
3.最大值发就是 Gray=max(R,G,B)
二、代码
-
加权法
Mat BGR2GRAY_Weight(Mat src) { if (src.channels()==1) { return src; } else if (src.channels() == 3 || src.channels() == 4) { int rows = src.rows; int cols = src.cols; Mat mGray(rows, cols, CV_8UC1, Scalar(100, 0, 0)); int bValue, gValue, rValue; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { bValue = src.at<Vec3b>(i, j)[0]; gValue = src.at<Vec3b>(i, j)[1]; rValue = src.at<Vec3b>(i, j)[2]; mGray.at<uchar>(i, j) = saturate_cast<uchar>(0.11*bValue + 0.59*gValue + 0.3*rValue); } } return mGray; } else { throw "error"; } }
-
平均值法
Mat BGR2GRAY_Average(Mat src) { if (src.channels() == 1) { return src; } else if (src.channels() == 3 || src.channels() == 4) { int rows = src.rows; int cols = src.cols; Mat mGray(rows, cols, CV_8UC1, Scalar(100, 0, 0)); int bValue, gValue, rValue; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { bValue = src.at<Vec3b>(i, j)[0]; gValue = src.at<Vec3b>(i, j)[1]; rValue = src.at<Vec3b>(i, j)[2]; mGray.at<uchar>(i, j) = saturate_cast<uchar>((bValue + gValue + rValue) / 3); } } return mGray; } else { throw "error"; } }
-
最大值法
Mat BGR2GRAY_Max(Mat src) { if (src.channels() == 1) { return src; } else if (src.channels() == 3 || src.channels() == 4) { int rows = src.rows; int cols = src.cols; Mat mGray(rows, cols, CV_8UC1, Scalar(100, 0, 0)); int bValue, gValue, rValue; int nMaxValue; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { bValue = src.at<Vec3b>(i, j)[0]; gValue = src.at<Vec3b>(i, j)[1]; rValue = src.at<Vec3b>(i, j)[2]; nMaxValue = bValue; if (nMaxValue < gValue) { nMaxValue = gValue; } if (nMaxValue < rValue) { nMaxValue = rValue; } mGray.at<uchar>(i, j) = saturate_cast<uchar>(nMaxValue); } } return mGray; } else { throw "error"; } }
-
测试代码
// function.cpp : 定义控制台应用程序的入口点。 #include <opencv2\opencv.hpp> #include "stdafx.h" using namespace cv; using namespace std; //BGR图转灰度图 //3种方法:加权法,均值法,最大值法 Mat BGR2GRAY_Weight(Mat src); //BGR图转灰度图 //3种方法:加权法,均值法,最大值法 Mat BGR2GRAY_Average(Mat src); //BGR图转灰度图 //3种方法:加权法,均值法,最大值法 Mat BGR2GRAY_Max(Mat src); int main() { Mat mSrc = imread("./photo/photo_001.jpg", 1); imshow("Src", mSrc); waitKey(10); Mat mGray = BGR2GRAY_Weight(mSrc); imshow("Gray_weight", mGray); mGray = BGR2GRAY_Average(mSrc); imshow("Gray_average", mGray); mGray = BGR2GRAY_Max(mSrc); imshow("Gray_max", mGray); waitKey(10); cout << mGray << endl; system("pause"); return 0; } Mat BGR2GRAY_Weight(Mat src) { if (src.channels()==1) { return src; } else if (src.channels() == 3 || src.channels() == 4) { int rows = src.rows; int cols = src.cols; Mat mGray(rows, cols, CV_8UC1, Scalar(100, 0, 0)); int bValue, gValue, rValue; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { bValue = src.at<Vec3b>(i, j)[0]; gValue = src.at<Vec3b>(i, j)[1]; rValue = src.at<Vec3b>(i, j)[2]; mGray.at<uchar>(i, j) = saturate_cast<uchar>(0.11*bValue + 0.59*gValue + 0.3*rValue); } } return mGray; } else { throw "error"; } } Mat BGR2GRAY_Average(Mat src) { if (src.channels() == 1) { return src; } else if (src.channels() == 3 || src.channels() == 4) { int rows = src.rows; int cols = src.cols; Mat mGray(rows, cols, CV_8UC1, Scalar(100, 0, 0)); int bValue, gValue, rValue; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { bValue = src.at<Vec3b>(i, j)[0]; gValue = src.at<Vec3b>(i, j)[1]; rValue = src.at<Vec3b>(i, j)[2]; mGray.at<uchar>(i, j) = saturate_cast<uchar>((bValue + gValue + rValue) / 3); } } return mGray; } else { throw "error"; } } Mat BGR2GRAY_Max(Mat src) { if (src.channels() == 1) { return src; } else if (src.channels() == 3 || src.channels() == 4) { int rows = src.rows; int cols = src.cols; Mat mGray(rows, cols, CV_8UC1, Scalar(100, 0, 0)); int bValue, gValue, rValue; int nMaxValue; for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { bValue = src.at<Vec3b>(i, j)[0]; gValue = src.at<Vec3b>(i, j)[1]; rValue = src.at<Vec3b>(i, j)[2]; nMaxValue = bValue; if (nMaxValue < gValue) { nMaxValue = gValue; } if (nMaxValue < rValue) { nMaxValue = rValue; } mGray.at<uchar>(i, j) = saturate_cast<uchar>(nMaxValue); } } return mGray; } else { throw "error"; } }