点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

初学图像处理,在常用算法方面,二白实在是有些头疼。就在昨天,亲爱的小白师兄,对迷茫的二白伸出了援手,为二白送来了一大份干货——图像处理常用算法总结。二白仔细阅读了这些干货,并将其中的代码跑了几遍,觉得受益匪浅。在这里,二白将干货分享给大家。

1.二值化:

图1 二值化(阈值:140)处理效果

所谓二值化简单一点讲,就是将图像划分成黑和白,通过设定一个标准如果大于这个标准就设为白,如果小于这个标准,就设为黑,而这个标准,就叫做阈值。

具体定义如下所示:

下面给出实现的代码:

//二值化
//函数的参数iTR为阈值
void CBMPSampleDlg::ThresholdProcess(int iTR)
{//读取BMP文件m_Dib.AttachMapFile("1.bmp", TRUE);m_Dib.CopyToMapFile("二值化.bmp");//将像素指针定位到图像数据的开始RGBTRIPLE *rgbtri = (RGBTRIPLE *)m_Dib.m_lpImage;//获得图像的大小int iSize = m_Dib.GetSizeImage();//BMP文件头指针BITMAPINFOHEADER * pBmiHeader = (BITMAPINFOHEADER *)m_Dib.m_lpBMIH;//遍历每一个像素,并判断每一个像素的分量(RGB),将其与阈值比较,然后进行赋值for(int i = 0; i < iSize/( pBmiHeader->biBitCount / 8); i++){if ( (rgbtri[i].rgbtRed < iTR )| (rgbtri[i].rgbtGreen < iTR) | (rgbtri[i].rgbtBlue < iTR) ){rgbtri[i].rgbtRed   = (BYTE) 0;rgbtri[i].rgbtGreen = (BYTE) 0;rgbtri[i].rgbtBlue  = (BYTE) 0;}else{rgbtri[i].rgbtRed   = (BYTE) 255;rgbtri[i].rgbtGreen = (BYTE) 255;rgbtri[i].rgbtBlue  = (BYTE) 255;}}//显示图像DrawPic();
}

在读取图像之后,会将指针定位到图像像素数据的开始位置,然后获得图像的大小,然后通过BMP文件头获得图像的一个像素所占据的二进制的位数,这样就知道一个像素由几个字节组成的了,需要注意的是,一个像素不一定是由三个字节组成的,比如是灰度图像其只需要一个字节来存储一个像素究竟是灰到什么程度其范围在0-255 之间,而彩色图像却是由三种颜色组成的也就是所说的三原色RGB分别为Red、Green、Blue三种颜色组成,这三种颜色每个分量各占一个字节,所以这里需要三个字节,另外在BMP图像中还一个结构为RGBQUAD的结构体,这里一个像素占据的是4个字节,其实,这里就涉及到了8位图像24位图像以及32位图像的问题了,所谓的8位图像其实,每一个像素占一个字节,24位图像,每一个像素占据3个字节、而32位图像每一个像素占据4个字节就是这么来的。代码中,首先会读取原始图像文件,文件的格式为BMP的,关于BMP图像的存储结构,在接下来的文章中会讲到。

2.海报化

图2 海报化处理效果

所谓的海报化其实就是将每一个像素的分量与224进行与运算,而244的16进制表示可以表示成0xe0,前面介绍了一个像素的分量的范围在0-255范围内,所以只需要将这两个数值的二进制位相与即可完成海报化的处理效果。

下面为实现的具体代码:

//海报化
void CBMPSampleDlg::Posterize()
{m_Dib.AttachMapFile("1.bmp", TRUE);m_Dib.CopyToMapFile("海报化.bmp");RGBTRIPLE *rgbtri = (RGBTRIPLE *)m_Dib.m_lpImage;int iSize = m_Dib.GetSizeImage();BITMAPINFOHEADER * pBmiHeader = (BITMAPINFOHEADER *)m_Dib.m_lpBMIH;for(int i = 0; i < iSize/( pBmiHeader->biBitCount / 8); i++){rgbtri[i].rgbtRed   = (BYTE) (rgbtri[i].rgbtRed & 0xe0);rgbtri[i].rgbtGreen = (BYTE) (rgbtri[i].rgbtGreen & 0xe0);rgbtri[i].rgbtBlue  = (BYTE) (rgbtri[i].rgbtBlue & 0xe0);}DrawPic();
}

上面的这段代码是参考DirectShow里面的ezrgb24滤镜这个例子改写的,另外下面的灰度化也是采用里面的改写的。

3.灰度化

图3 灰度化处理效果

灰度化有很多种处理方法,有分量法、最大值法、平均值法以及加权平均值法。

1)分量法

将彩色图像中的三分量的亮度作为三个灰度图像的灰度值,可根据应用需要选取一种灰度图像。

f1(i,j)=R(i,j) f2(i,j)=G(i,j)f3(i,j)=B(i,j)

其中fk(i,j)(k=1,2,3)为转换后的灰度图像在(i,j)处的灰度值。

2)最大值法

将彩色图像中的三分量亮度的最大值作为灰度图的灰度值。

f(i,j)=max(R(i,j),G(i,j),B(i,j))

3) 平均值法

将彩色图像中的三分量亮度求平均得到一个灰度图。

f(i,j)=(R(i,j)+G(i,j)+B(i,j)) /3

4) 加权平均法

根据重要性及其它指标,将三个分量以不同的权值进行加权平均。由于人眼对绿色的敏感最高,对蓝色敏感最低,因此,按下式对RGB三分量进行加权平均能得到较合理的灰度图像。

f(i,j)=0.30R(i,j)+0.59G(i,j)+0.11B(i,j))

在我们的程序中,我们采用的是加权平均法进行灰度化。

下面为实现的代码:

//灰度化
void CBMPSampleDlg::ConvertToGray()
{m_Dib.AttachMapFile("1.bmp", TRUE);m_Dib.CopyToMapFile("灰度化.bmp");RGBTRIPLE *rgbtri = (RGBTRIPLE *)m_Dib.m_lpImage;int iSize = m_Dib.GetSizeImage();BITMAPINFOHEADER * pBmiHeader = (BITMAPINFOHEADER *)m_Dib.m_lpBMIH;int iGrayvalue = 0;//遍历每一个像素for(int i = 0; i < iSize/( pBmiHeader->biBitCount / 8); i++){iGrayvalue = int( rgbtri[i].rgbtBlue * 0.11 + rgbtri[i].rgbtGreen * 0.59 + rgbtri[i].rgbtRed * 0.3 );rgbtri[i].rgbtRed   = (BYTE) iGrayvalue;rgbtri[i].rgbtGreen = (BYTE) iGrayvalue;rgbtri[i].rgbtBlue  = (BYTE) iGrayvalue;}DrawPic();
}

在上述代码中,通过遍历每一个像素,然后计算该像素的三个分量的加权平均值,将三个分量设置成同一个值,这样就实现了对图像的灰度化处理。

4.模糊化

图4 模糊化处理效果

其实所谓的模糊化,就是将各个像素的相邻的像素的各个分量的值相加,然后除以2就可以实现对图像的模糊处理。

下面给出代码:

//模糊化
void CBMPSampleDlg::Blur()
{m_Dib.AttachMapFile("1.bmp", TRUE);m_Dib.CopyToMapFile("模糊化.bmp");RGBTRIPLE *rgbtri = (RGBTRIPLE *)m_Dib.m_lpImage;int iSize = m_Dib.GetSizeImage();BITMAPINFOHEADER * pBmiHeader = (BITMAPINFOHEADER *)m_Dib.m_lpBMIH;LONG lHeight = pBmiHeader->biHeight;LONG lWidth = pBmiHeader->biWidth;for (int y = 0 ; y < lHeight; y++) {for (int x = 2 ; x < lWidth; x++, rgbtri ++) {rgbtri->rgbtRed   = (BYTE) ((rgbtri->rgbtRed + rgbtri[2].rgbtRed) >> 1);rgbtri->rgbtGreen = (BYTE) ((rgbtri->rgbtGreen + rgbtri[2].rgbtGreen) >> 1);rgbtri->rgbtBlue  = (BYTE) ((rgbtri->rgbtBlue + rgbtri[2].rgbtBlue) >> 1);}rgbtri +=2;}DrawPic();
}

上面的代码同样是遍历每一个像素将前一个像素和后一个像素相加,然后将获得的值右移一位,这样就能实现除以2的效果,之所以做位运算,是因为位运算的速度比除法运算要快很多。

希望大家跟二白一起,学习图像处理,有大家的陪伴,二白再也不用担心被小白师兄批评啦。

本文转载自xizero00博客,并进行修改,仅用作学习交流,如有侵权,请联系后台删除

https://blog.csdn.net/xizero00/article/details/6631209

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

数字图像基本处理算法小结相关推荐

  1. 数据挖掘中分类算法小结

    数据挖掘中分类算法小结   数据仓库,数据库或者其它信息库中隐藏着许多可以为商业.科研等活动的决策提供所需要的知识.分类与预测是两种数据分析形式,它们可以用来抽取能够描述重要数据集合或预测未来数据趋势 ...

  2. [转载]SIFT(尺度不变特征变换)算法小结

    原文地址:SIFT(尺度不变特征变换)算法小结[转]作者:慕容天峰 最近一直在看SIFT算法.Sift是David Lowe于1999年提出的局部特征描述子,并于2004年进行了更深入的发展和完善.S ...

  3. 计算机网络量化噪音是怎么消除的,数字图像噪声消除算法研究(可编辑).doc

    数字图像噪声消除算法研究(可编辑) 数字图像噪声消除算法研究 曲阜师范大学 硕士学位论文 数字图像噪声消除算法研究 姓名:李波 申请学位级别:硕士 专业:计算机应用技术 指导教师:赵景秀字图像噪声消除 ...

  4. linemod算法小结

    Linemod算法小结   LineMod方法是由Hinterstoisser[1][2][3]在2011年提出,主要解决的问题是复杂背景下3D物体的实时检测与定位,用到了RGBD的信息,可以应对无纹 ...

  5. 分治算法小结(附例题详解)

    分治算法小结(附例题详解) 我的理解: 分治算法我的理解就是看人下菜碟,我们要解决的问题就好像一群人构成的集体,要我们解决这个问题,那我们就要满足这群人里面每个人不同的需求,也就是写出解决的代码,把每 ...

  6. 数字图像基本处理算法

    数字图像基本处理算法 xizero00 常熟理工学院(CIT) 计算机科学与工程学院  下一代互联网实验室(NGIL Lab) Email:xizero00@163.com 由于SIFT算法需要用到很 ...

  7. Fast Gradient Sign Attack(FGSM)算法小结

    Fast Gradient Sign Attack(FGSM)算法小结 对抗攻击引发了机器学习一系列的思考,训练出来的model是否拥有强大的泛化能力?模型的准确率是否真实? 在对抗攻击中添加一些肉眼 ...

  8. 数字图像相关DIC算法,Ubuntu16.04,Ncorr项目C++版本开源环境配置

    数字图像相关DIC算法,Ubuntu16.04,NcorrC++版本开源代码环境配置流程. 本文介绍C++版本数字图像相关法DIC环境配置过程,配置了好几天,痛苦踩坑经历. DIC算法.资料.源码.实 ...

  9. 距离(distance)算法小结

    18种和"距离(distance)"."相似度(similarity)"相关的量的小结 在计算机人工智能领域,距离(distance).相似度(similari ...

最新文章

  1. kafka partition分配_kafka的分区分配策略
  2. windows server 2008 r2 enterprise ,惠普DL 580 G7服务器报,事件 ID: 47错误。
  3. map,filter,reduce函数总结
  4. Jsoncpp Compiler、Programming
  5. 从零开始学习docker(二十)RoutingMesh--Ingress负载均衡
  6. Log and display Log text type in Account Overview page
  7. 数据揭秘中国女性的薪水普遍比男性低,说好的“同工同酬”呢?
  8. 零基础学python难吗-零基础学Python难吗,或者有什么其他数据加工软件推荐?
  9. bat脚本保存dir结果_DOS批处理脚本及应用举例
  10. 【目标定位】基于matlab卡尔曼滤波UWB-IMU组合定位导航【含Matlab源码 1601期】
  11. windows做软件界面
  12. 如果U盘中了文件夹隐藏病毒,怎么办?
  13. 电脑长时间睡眠会自动关机吗_电脑睡眠久了是不是自动关机
  14. 关于CPU架构之总结
  15. 李彦宏高中全国计算机比赛,中国互联网“男神”李彦宏学生时代的那些事
  16. 国外知名音视频领域的科技公司
  17. python职能-python运维工程师主要干什么
  18. 同步软件、网络同步、备份、分享工具
  19. TypeError: can‘t subtract offset-naive and offset-aware datetimes
  20. Access 密码破解原理- -

热门文章

  1. 来自程序员的福利!用Python做一款翻译软件
  2. 同样是AI技术,为什么只有一加6称得上“全速”旗舰?
  3. 想去Google做AI?面试题在手,全程无忧!
  4. python语音识别终极指南
  5. 我要狠狠的反驳“公司禁止使用Lombok”的观点
  6. 深入理解Ribbon之源码解析
  7. 麦肯锡:优秀数据科学家的5个特征!
  8. 我们与Datawhale的故事!
  9. 又是华为!对标 TensorFlow、PyTorch,深度学习框架 MindSpore已开源!附入手公开课...
  10. 让PyTorch训练速度更快,你需要掌握这17种方法