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

一、原理
对于图像由彩色图转化为灰度图有三种方法
分别为 加权法 均值法 最大值法
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";
     }
     }
    
  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值