这里我用的摄像头是OV2640,这款摄像头的像素是200万。通过对摄像头拍摄图像的进行图像的转化,先把图像的格式转化为RGB565,然后在进行灰度的转化,最后进行二值化处理,设定阈值,进行二值化的处理,通过设置二值化的位数可以提高二值化的精度,使二值化的效果更加清晰,我用的OV2640可以对焦距进行调节,这样的话,可以使拍摄的图像的效果更加完善。大家可以根据自己的摄像头进行设置。我看了飞思卡尔的K60带的摄像头山外鹰眼OV7725,他带的摄像头可以通过硬件进行二值化(硬性二值化)的处理,效果非常好,也可以说效果比我们用软件实现的效果不知道要好多少;还有就是现在比较火的一款图像设别的开源设备openmv使用python写的图形处理,openmv在颜色识别、二维码识别、面部识别、图像识别和特征点识别上功能非常强大,感兴趣的可以自己去尝试玩一下。

方法一:
    对于彩色转灰度,有一个很著名的心理学公式:

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

方法二:

而实际应用时,希望避免低速的浮点运算,所以需要整数算法。
     注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法:

Gray = (R*299 + G*587 + B*114 + 500) / 1000

RGB一般是8位精度,现在缩放1000倍,所以上面的运算是32位整型的运算。注意后面那个除法是整数 除法,所以需要加上500来实现四舍五入。
      就是由于该算法需要32位运算,所以该公式的另一个变种很流行:

Gray = (R*30 + G*59 + B*11 + 50) / 100

方法三:

上面的整数算法已经很快了,但是有一点仍制约速度,就是最后的那个除法。移位比除法快多了,所以可以将系数缩放成2的整数幂。
习惯上使用16位精度,2的16次幂是65536,所以这样计算系数:

0.299 * 65536 = 19595.264 ≈ 19595
                          0.587 * 65536 + (0.264) = 38469.632 + 0.264 = 38469.896 ≈ 38469
                          0.114 * 65536 + (0.896) =   7471.104 + 0.896 = 7472

可能很多人看见了,我所使用的舍入方式不是四舍五入。四舍五入会有较大的误差,应该将以前的计算结果的误差一起计算进去,舍入方式是去尾法:

写成表达式是:

Gray = (R*19595 + G*38469 + B*7472) >> 16

2至20位精度的系数:

Gray = (R*1 + G*2 + B*1) >> 2
                          Gray = (R*2 + G*5 + B*1) >> 3
                          Gray = (R*4 + G*10 + B*2) >> 4
                          Gray = (R*9 + G*19 + B*4) >> 5
                          Gray = (R*19 + G*37 + B*8) >> 6
                          Gray = (R*38 + G*75 + B*15) >> 7
                          Gray = (R*76 + G*150 + B*30) >> 8
                          Gray = (R*153 + G*300 + B*59) >> 9
                          Gray = (R*306 + G*601 + B*117) >> 10
                          Gray = (R*612 + G*1202 + B*234) >> 11
                          Gray = (R*1224 + G*2405 + B*467) >> 12
                          Gray = (R*2449 + G*4809 + B*934) >> 13
                          Gray = (R*4898 + G*9618 + B*1868) >> 14
                          Gray = (R*9797 + G*19235 + B*3736) >> 15
                          Gray = (R*19595 + G*38469 + B*7472) >> 16
                          Gray = (R*39190 + G*76939 + B*14943) >> 17
                          Gray = (R*78381 + G*153878 + B*29885) >> 18
                          Gray = (R*156762 + G*307757 + B*59769) >> 19
                          Gray = (R*313524 + G*615514 + B*119538) >> 20

仔细观察上面的表格,这些精度实际上是一样的:3与4、7与8、10与11、13与14、19与20
所以16位运算下最好的计算公式是使用7位精度,比先前那个系数缩放100倍的精度高,而且速度快:

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

其实最有意思的还是那个2位精度的,完全可以移位优化:

Gray = (R + (WORD)G<<1 + B) >> 2

方法四:

    另一种是 Adobe Photoshop 里的公式 
     Adobe RGB (1998) [gamma=2.20] 
     Gray = (R^2.2 * 0.2973 + G^2.2 * 0.6274 + B^2.2 * 0.0753)^(1/2.2)

该方法运行速度稍慢,但是效果很好。

方法五:

     还有就是平均值方法 

      GRAY = (RED+BLUE+GREEN)/3

    (GRAY,GRAY,GRAY ) 替代 (RED,GREEN,BLUE)

     但是这样做的精度比较低,图像转化为灰度效果不是太好。

综合上面的算法对我个人而言,我更喜欢用方法三的转化方法,转化的效果跟转化的精度都可以。

下面是我利用OV2640摄像头与灰度公式Gray = (R*19595 + G*38469 + B*7472) >> 16进行拍摄的图像,上面是灰度图像,下面是二值化图像,因为边沿所以导致在图像周围很多噪点。

下面的图像阈值我设置为90,因为这是我晚上做的实验,晚上工作室光照强度不好,调大阈值可以得到更好的二值化图像。旁边的黑点同样是边缘造成的噪点,只要进行个过滤噪点操作就可以了。

RGB转灰度的几种算法相关推荐

  1. 【RGB转灰度的几种算法】

    RGB转灰度的几种算法 这里我用的摄像头是OV2640,这款摄像头的像素是200万.通过对摄像头拍摄图像的进行图像的转化,先把图像的格式转化为RGB565,然后在进行灰度的转化,最后进行二值化处理,设 ...

  2. 将RGB值转换为灰度值的简单算法(转)

    将RGB值转换为灰度值的简单算法 原文:http://blog.163.com/zhaowei0425@126/blog/static/475860302011311103956748/ RGB是如何 ...

  3. 五种基于RGB色彩空间统计的皮肤检测算法

    最近一直在研究多脸谱识别以及如何分辨多个皮肤区域是否是人脸的问题 网上找了很多资料,看了很多篇文章,将其中基于RGB色彩空间识别皮肤 的统计算法做了一下总结,统计识别方法主要是简单相比与很多其它基于 ...

  4. 数字图像隐藏图像的两种算法及实现代码

    数字图像 二值图像 也叫单色图像,是将每个像素点存放在一个bit空间(值为0或者1)的图像,也就是说每个像素"非黑即白",主要用于图像形态学的研究. 8位灰度图像 每个像素存放在一 ...

  5. python OpenCV 图片相似度 5种算法

    原始两张图片: 代码运行结果如下. 5种算法 值哈希算法.差值哈希算法和感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的hash值有多少不同. 三直方图和单通道直方图的值为0 ...

  6. DL之NN/Average_Darkness/SVM:手写数字图片识别(本地数据集50000训练集+数据集加4倍)比较3种算法Average_Darkness、SVM、NN各自的准确率

    DL之NN/Average_Darkness/SVM:手写数字图片识别(本地数据集50000训练集+数据集加4倍)比较3种算法Average_Darkness.SVM.NN各自的准确率 目录 数据集下 ...

  7. 相似图片搜索的三种算法

    相似图片搜索的三种算法 想必大家都用google或baidu的识图功能,上面就是我搜索冠希哥一幅图片的结果,这种搜索的核心算法有三种,都是利用信息指纹比较,这些算法都很易懂,下面分别介绍一下: 一.平 ...

  8. 绘制云图的三种算法(附C#代码)

    我们要做什么呢?就是输入一个二维数组, TestData = new double[9, 6] {{ 26,28,29,32,28,27},{ 27,30,32,35,30,28},{ 24,27,3 ...

  9. matlab uint8转uint16,MATLAB图像uint8,uint16,double, rgb转灰度解释

    1.uint8,uint16与double 为了节省存储空间,matlab为图像提供了特殊的数据类型uint8(8位无符号整数),以此方式存储的图像称作8位图像.matlab读入图像的数据是uint8 ...

  10. 腾讯AI开源框架Angel 3.0重磅发布:超50万行代码,支持3种算法,打造全栈机器学习平台...

    出品 | AI科技大本营(ID:rgznai100) [导语]2019年8月22日,腾讯首个AI开源项目Angel正式发布3.0版本.Angel 3.0尝试打造一个全栈的机器学习平台,功能特性涵盖了机 ...

最新文章

  1. 个人对继承理解以及虚析构函数的理解
  2. Android之实现京东底部添加到购物车的效果
  3. 开发日记-20190710 关键词 读书笔记 《Perl语言入门》Day 7
  4. file.php https,使用HTTPS链接和php方法(file_get_contents,getimagesize)
  5. Cognos 10.1 饼图百分比小数点显示的问题
  6. bzoj 1016 [JSOI2008]最小生成树计数——matrix tree(相同权值的边为阶段缩点)(码力)...
  7. 分析citibike数据eda
  8. HTML CSS样式表布局
  9. 中国互联网企业综合实力研究报告(2020)
  10. python界面编程 plc_在python gui编程怎么运行
  11. 编码——隐匿在计算机软硬件背后的语言
  12. 如何在 Mac 上将 WebP 图像批量转换为 JPG?
  13. 基于stc15f2k60s2芯片单片机编程(流水灯)
  14. Java基本数据类型及对应包装类
  15. 4维俄罗斯方块 java_烧脑的方块:解析“俄罗斯方块”4种不同的基础模块
  16. JAVA解析Excel工具EasyExcel(alibaba)
  17. 打印机设置纵向打印,打印出来确实横向
  18. codeforces 757e Bash Plays with Functions
  19. 第四章——软件测试流程和规范
  20. AFNetworking缓存

热门文章

  1. IE9下的怪异现象求解
  2. github-上传本地代码到github仓库
  3. javplayer 使用教程_PS教程连载第91课:PS核心功能:剪贴蒙版讲解
  4. 论文阅读笔记《CODE: Coherence Based Decision Boundaries for Feature Correspondence》
  5. Android的View事件分发机制原理
  6. 用什么擦地最干净脑筋急转弯_100个脑筋急转弯,很多人困在了第8题,赶快考考孩子吧...
  7. 平面纹理坐标和球面坐标互相转换
  8. python微信推送{u‘errcode‘: 40008, u‘errmsg‘: u‘invalid message type rid: 6111061f-19703d5b
  9. 常见的系统间接口方式(02)-中间件的数据接口模式
  10. 顶级域名、一级域名、二级域名、三级域名的区别