图像由彩色图转化为灰度图的三种方法

一、原理
对于图像由彩色图转化为灰度图有三种方法
分别为 加权法 均值法 最大值法
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(i, j)[0];
         gValue = src.at(i, j)[1];
         rValue = src.at(i, j)[2];
         mGray.at(i, j) = saturate_cast(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(i, j)[0];
     			gValue = src.at(i, j)[1];
     			rValue = src.at(i, j)[2];
     			mGray.at(i, j) = saturate_cast((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(i, j)[0];
     		gValue = src.at(i, j)[1];
     		rValue = src.at(i, j)[2];
     		nMaxValue = bValue;
     		if (nMaxValue < gValue)
     		{
     			nMaxValue = gValue;
     		}
     		if (nMaxValue < rValue)
     		{
     			nMaxValue = rValue;
     		}
     		mGray.at(i, j) = saturate_cast(nMaxValue);
     	}
     }
     return mGray;
     }
     else
     {
     	throw "error";
     }
     }
    
  • 测试代码

     // function.cpp : 定义控制台应用程序的入口点。
     #include 
     #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(i, j)[0];
     		gValue = src.at(i, j)[1];
     		rValue = src.at(i, j)[2];
     		mGray.at(i, j) = saturate_cast(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(i, j)[0];
     		gValue = src.at(i, j)[1];
     		rValue = src.at(i, j)[2];
     		mGray.at(i, j) = saturate_cast((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(i, j)[0];
     		gValue = src.at(i, j)[1];
     		rValue = src.at(i, j)[2];
     		nMaxValue = bValue;
     		if (nMaxValue < gValue)
     		{
     			nMaxValue = gValue;
     		}
     		if (nMaxValue < rValue)
     		{
     			nMaxValue = rValue;
     		}
     		mGray.at(i, j) = saturate_cast(nMaxValue);
     	}
     }
     return mGray;
     }
     else
     {
     	throw "error";
     }
     }
    

你可能感兴趣的:(opencv,C++,opencv)