RGB图像转为灰度图

本文介绍了如何将RGB图像转换为灰度图像,通过不同的系数公式和位操作优化,例如Grey = (306*R + 601*G + 117*B) >> 10,来提高转换效率,减少计算次数和精度损失。
摘要由CSDN通过智能技术生成

最后结论:

Grey = (R*38 + G*75 + B*15)>> 7

代码

#include <cv.h>
#include <highgui.h>
 
using namespace cv;
int main(){
         Mat src= imread("C:\\Users\\Poplar\\Pictures\\ff.jpg");
         Mat grey(src.rows, src.cols, CV_8UC1, Scalar(0));
         for (inty = 0; y < src.rows; y++)
         {
                   uchar*cp = src.ptr<uchar>(y);
                   uchar*gp = grey.ptr<uchar>(y);
                   for(int x = 0; x < src.cols; x++){
                            *gp= (15*cp[0] + 75*cp[1] + 38*cp[2]) >> 7;
                            cp+= 3;
                            gp++;
                   }
         }
         imshow("src",src);
         imshow("grey",grey);
         waitKey(0);
         return0;
}

效果如图


 

下面具体解释


RGB彩色图像中,一种彩色由R(红色),G(绿色),B(蓝色)三原色按比例混合而成。

图像的基本单元是一个像素,就像一个巨幅电子广告屏上远处看是衣服图像,走近你会看到一个一个的方格,这个方格的颜色是一种,从远处看,觉察不到这个方格的存在。

一个像素需要3块表示,分别代表R,G,B,如果8为表示一个颜色,就由0-255区分不同亮度的某种原色。

一张9像素的8位RGB图像,在计算机内存中的分布大概示意如下:


实际中数都是二进制形式的,并且未必按照R,G,B顺序,比如opencv是按照B,G,R顺序将三个色值保存在3个连续的字节里

 

灰度图像是用不同饱和度的黑色来表示每个图像点,比如用8位 0-255数字表示“灰色”程度,每个像素点只需要一个灰度值,8位即可,这样一个3X3的灰度图,只需要9个byte就能保存

RGB值和灰度的转换,实际上是人眼对于彩色的感觉到亮度感觉的转换,这是一个心理学问题,有一个公式:

Grey = 0.299*R + 0.587*G + 0.114*B

根据这个公式,依次读取每个像素点的R

  • 28
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值