第五节 CImage和CBmp(二)
由于这个库主要用于VC MFC下开发应用,因此目前可以下载到版本只支持MFC开发。如果您需要标准Win32的库,可以在回复时留下您的邮箱,或跟我联系。
Email:wuchunlei@163.com
QQ:819543772
EasyAnalysis图像分析库测试版以及源代码下载地址:
下载地址:
http://www.5941ts.com/EasyAnalysis/EasyAnalysis.rar
共190KB
本小节所涉及的源程序:
http://www.5941ts.com/EasyAnalysis/demo/5/TestDll.rar
上面一个小节介绍了CBmp和CImage中的基本功能,经过阅读和时间想必大家已经对类的结构和应用有了大致的了解,这一小节主要介绍,CBmp和CImage类中几个比较实用的图像处理功能。
一.图像相减
桢差法是对运动物体定位的一种常用方法,通常使用连续捕获到的两到三张图象,通过像素相减求得图像间的差异,为后续识别和定位打下基础。图像相减在CBmp类中重载运算符“-”完成,由于任何一种图像格式在做减法时都只有像素参与了运算,因此为了程序有良好的复用结构,具体像素之间的减法在CImage中实现。
1. 相同尺寸图像相减
函数声明:CBmp operator-(CBmp &m_Bmp) throw();
返回值:CBmp
函数功能:重载运算符实现Bmp图像相减
应用举例:
try
{
CBmp m_BmpBk; //背景图片
CBmp m_BmpFk; //前景图片
CBmp m_Bmp; //保存结果
m_BmpBk.CreateImage("背景.bmp"); //通过文件初始化CBmp对象
m_BmpFk.CreateImage("人物.bmp");
m_Bmp=m_BmpFk-m_BmpBk; //背景相减
m_Bmp.SaveData("test1.bmp");
}
catch(CPException &err)
{
int nErrCode=err.GetErrCode(); //取错误类型代码
MessageBox(err.GetErrMsg()); //弹出错误信息
}
处理结果见下图(上左:背景图片 上右:人物和背景 下左:相减后的结果):
注:为了最大化的保留图像相减后的信息,相减后取结果的绝对值。
2. 不同尺寸的图像相减
细心的朋友可能已经发现了,上述图像相减是在尺寸、颜色位数完全相同的情况下而做的。在图像尺寸不同的时,如果直接应用上述方法,程序会抛出一个异常代码为ERR_NOT_EQUAL_SIZE的CPException的异常。在图像尺寸不同的时候,我们需要先使用CBmp的AdjustImageToEqualSize()函数将两幅图像的尺寸、颜色位数调整为相同大小,然后在通过上述方法即可实现不同尺寸的图像相减的功能。
函数原型:static void AdjustImageToEqualSize(CBmp &m_BmpA,CBmp &m_BmpB)
返回值:静态函数,m_BmpA,m_BmpB即用于输入原始图像,又用于返回校调整好的图像
函数功能:将图像尺寸、颜色位数调整为相同的大小。调整原则:
I. 取两幅图像中biHeight属性大的值作为新图像的biHeight
II. 取两幅图像中biWidth属性大的值作为新图像的biWidth
III. 取两幅图像中biBitCount属性大的值作为新图像的biBitCount
IV. 新图像中像素矩阵坐标属于原图像的,直接丛原图像中复制到新图像中,否则新图像中该位置像素补0
应用举例:
try
{
CBmp m_BmpA;
CBmp m_BmpB;
CBmp m_Bmp; //保存结果
m_BmpA.CreateImage("汉字.bmp"); //通过文件初始化CBmp对象
m_BmpB.CreateImage("人物.bmp");
CBmp::AdjustImageToEqualSize(m_BmpA,m_BmpB); //调整两幅图像尺寸
m_Bmp=m_BmpA-m_BmpB; //背景相减
m_Bmp.SaveData("test2.bmp");
}
catch(CPException &err)
{
int nErrCode=err.GetErrCode(); //取错误类型代码
MessageBox(err.GetErrMsg()); //弹出错误信息
}
程序运行效果如下(上:原始图片,下:相减后的图片)
从运行结果可以看出,左上图由于小于左上图尺寸的位置补了零,因此上下两幅图像相减后大于左上图尺寸的像素位置没有变化,而两幅图像重叠的部分做了减法。
二.图像相加:
图像相加也是图像分析技术中常用的操作之一,下面介绍EasyAnalysis库中提供的图像加法操作。
1. 相同尺寸的图像相加:
函数声明:CBmp operator+CBmp &m_Bmp) throw();
返回值:CBmp
函数功能:重载运算符实现Bmp图像相加
应用举例:
//相同尺寸的图像加法
try
{
CBmp m_BmpA;
CBmp m_BmpB;
CBmp m_Bmp; //保存结果
m_BmpA.CreateImage("人物.bmp"); //通过文件初始化CBmp对象
m_BmpB.CreateImage("人物1.bmp");
//CBmp::AdjustImageToEqualSize(m_BmpA,m_BmpB); //调整两幅图像尺寸
m_Bmp=m_BmpA+m_BmpB; //图像相加
m_Bmp.SaveData("test3.bmp");
}
catch(CPException &err)
{
int nErrCode=err.GetErrCode(); //取错误类型代码
MessageBox(err.GetErrMsg()); //弹出错误信息
}
运行结果如下(上:原始图像,下:相加后的结果)
可以看出,通过上述操作,将两幅图像逐个像素平权的相加,是不是有点蒙太奇的效果:)
注:平权相加指两幅图像矩阵乘以一个相同的常数后再相加,为了不增加输出图像的总强度,因此重载运算符“+”实际上是实现将两幅图像同时乘以0.5,然后再相加。
2. 不同尺寸的图像相加:
图像减法中不同尺寸相减可能用得较少,但是图像加法中不同尺寸图像加法用得相对来说就比较多了,最常见的就是为图像增加数字水印。与图像减法相同,如果图像尺寸不同,那么同样只需要使用AdjustImageToEqualSize()先将图像尺寸调整一致,然后再行相加即可。下面给出了不同尺寸图像加法的源代码:
//不同尺寸的图像加法
try
{
CBmp m_BmpA;
CBmp m_BmpB;
CBmp m_Bmp; //保存结果
m_BmpA.CreateImage("人物.bmp"); //通过文件初始化CBmp对象
m_BmpB.CreateImage("汉字.bmp");
CBmp::AdjustImageToEqualSize(m_BmpA,m_BmpB); //调整两幅图像尺寸
m_Bmp=m_BmpA+m_BmpB; //图像相加
m_Bmp.SaveData("test4.bmp");
}
catch(CPException &err)
{
int nErrCode=err.GetErrCode(); //取错误类型代码
MessageBox(err.GetErrMsg()); //弹出错误信息
}
程序运行结果如下:
3. 图像的带权相加
上面操作虽然将汉字和人物图片重叠在同一幅图片之上,但是由于重载操作符“+”是以0.5为系数的平权相加,因此图像中汉字以外的区域由于补了0的缘故被削弱了一倍,显然我们是不需要削弱这些部分的,为了解决这个问题,EasyAnalysis库提供了一个更加灵活的函数AddImageByWeight()。
函数声明:static CBmp AddImageByWeight(CBmp &m_BmpA,CBmp &m_BmpB,float fWA,float fWB)
返回值:CBmp
函数功能:静态函数,实现如下形式的图像相加:
NewBmp=fWA*[m_BmpA]+fWB*[m_BmpB];
应用举例:
try
{
CBmp m_BmpA;
CBmp m_BmpB;
CBmp m_Bmp; //保存结果
m_BmpA.CreateImage("人物.bmp"); //通过文件初始化CBmp对象
m_BmpB.CreateImage("汉字.bmp");
CBmp::AdjustImageToEqualSize(m_BmpA,m_BmpB); //调整两幅图像尺寸
m_Bmp=CBmp::AddImageByWeight(m_BmpA,m_BmpB,1,0.3); //图像相加
m_Bmp.SaveData("test5.bmp");
}
catch(CPException &err)
{
int nErrCode=err.GetErrCode(); //取错误类型代码
MessageBox(err.GetErrMsg()); //弹出错误信息
}
从上图可以看出,通过调整权值,输出的图像有了明显的改善。虽然图像比上面直接相减的效果好些,但是汉字部分始终有讨厌的白色底色。在对EasyAnalysis库的所有功能介绍完毕以后,我会在后面的高级应用篇中介绍如何将汉字完美的添加到人物图像中去。
转载于:https://www.cnblogs.com/wude/archive/2007/10/25/1941634.html
第五节 CImage和CBmp(二)相关推荐
- Python编程基础:第十五节 二维列表2D Lists
第十五节 二维列表2D Lists 前言 实践 前言 列表中的元素可以是任何形式,整型.浮点型.字符串型,甚至是一个列表.当列表的元素也是列表时,我们将其称为二维列表. 实践 我们先来创建多个一维列表 ...
- 第三百二十五节,web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签...
第三百二十五节,web爬虫,scrapy模块标签选择器下载图片,以及正则匹配标签 标签选择器对象 HtmlXPathSelector()创建标签选择器对象,参数接收response回调的html对象 ...
- (计算机组成原理)第五章中央处理器-第五节2:指令流水线影响因素和分类及多发技术
文章目录 一:影响指令流水线的因素 (1)结构相关(资源冲突) (2)数据相关(数据冲突) (3)控制相关(控制冲突) 二:流水线的分类 (1)根据流水线使用的级别不同分类 (2)根据流水线可以完成的 ...
- 【计导非课系列】 第五节 二进制 进制计算 编码
[计导非课系列] 第五节 二进制 进制计算 编码 对于计算机来说,数字只有两个--0和1. 数据对于计算机来说是相当重要的,而电路的通断两种状态决定了计算机只能通过1和0来进行一切事情的处理.所以,我 ...
- 高等数学笔记-乐经良老师-第四章-微分中值定理和导数的应用-第五节-曲线的曲率
高等数学笔记-乐经良 第四章 微分中值定理和导数的应用 第五节 曲线的曲率 一.弧长和弧微分 弧长 曲线内接折线长度的极限 ( 组成折线的线段长 → 0 \rightarrow 0 →0 ) 设曲 ...
- 向量图 正弦交流电路_第五节 正弦交流电路的相量(图)法求解.ppt
第五节 正弦交流电路的相量(图)法求解 第五节 正弦交流电路的相量(图)法求解 一. 用相量图分析电路的主要依据 (1)在任一线性电路中,各同频率的正弦量可以 (2)R.L.C元件的电压和电流相量关系 ...
- 五节课从零起步(无需数学和Python基础)编码实现AI人工智能框架电子书V1
五节课从零起步 (无需数学和Python 基础) 编码实现AI 人工智能框架 王 家 林 2018/4/15 ...
- 车站计算机系统具有自诊断功能,第五节自动检售票系统.ppt
第五节自动检售票系统 第五节 自动检售票系统 第五节 自动检售票系统 一﹑票制及票务管理 1.票制 2.票务管理 二﹑系统组成及功能 1.中央计算机系统 2.车站计算机系统 3.AFC终端设备 票 制 ...
- [基于STM32底盘控制与ROS上层导航小车制作] 第五节 实现STM32与ubuntu系统下的ROS串口DMA通信,传输底盘速度等信息
系列文章目录 第一节 stm32电机驱动与编码器读取反馈 第二节 stm32电机pid控制 第三节 stm32线速度标定 第四节 stm32添加mpu6050得到angle角度 第五节 实现STM32 ...
最新文章
- Youtube-dl调用外部Aria2多线程加速下载
- 证书到期了_注意!出口沙特所有扁钢制品证书将于8月26日到期 ,需要强制QM
- Youtube推荐系统是如何挖掘用户内心另一面的
- rust(50)-图像(3)
- ofo引入信用分评系统 ,0分将被禁止使用
- 【渝粤教育】电大中专电子商务网站建设与维护 (11)作业 题库
- Spring的AOP-基本概念
- 的向上取整函数_计算机二级Excel常用函数解析
- 编程语言五花八门,哪种可以让程序员赚到更多钱?
- Node.js-Express框架
- 从0开始架构一个IOS程序——03 — -分包用添加pch全局引用文件
- 使用Transformers离线模型(以bert模型为例)
- node.js实现网络爬虫获取区划代码和城乡划分代码
- 共享电动滑板车来了,它估值为何高达20亿美金?
- opencv将整数像素图片转化为浮点型
- 南京柳树湾与云南汉族人
- 【漫步计算机系统】:发展概览Ⅲ
- linux搜狗输入法不显示候选框问题
- 小蚁智能摄像机服务器故障,小蚁智能摄像机app怎么和摄像头连接
- Router-based Federation架构下如何解析路径
热门文章
- 打印心形c语言,C语言打印心形
- linux 挂载san存储,新手看招:Linux操作系统下挂载SAN资源
- matlab能力处理,书+程序《MATLAB图像处理:能力提高与应用案例》赵小川
- java导出hbase表数据_通用MapReduce程序复制HBase表数据
- django 返回ajax html,Django 前台通过json 取出后台数据
- 【精品计划 附录2】- 算法分析
- leetcode105 前序中序遍历序列构造二叉树
- 面试题——死锁的实现
- codeforces 977A-C语言解题报告
- Windows查找JDK的路径