第五节 CImage和CBmp(二)

由于这个库主要用于VC MFC下开发应用,因此目前可以下载到版本只支持MFC开发。如果您需要标准Win32的库,可以在回复时留下您的邮箱,或跟我联系。

       Emailwuchunlei@163.com

       QQ819543772

EasyAnalysis图像分析库测试版以及源代码下载地址:

下载地址:

http://www.5941ts.com/EasyAnalysis/EasyAnalysis.rar

190KB

本小节所涉及的源程序:

http://www.5941ts.com/EasyAnalysis/demo/5/TestDll.rar

 

 

       上面一个小节介绍了CBmpCImage中的基本功能,经过阅读和时间想必大家已经对类的结构和应用有了大致的了解,这一小节主要介绍,CBmpCImage类中几个比较实用的图像处理功能。

 

一.图像相减

桢差法是对运动物体定位的一种常用方法,通常使用连续捕获到的两到三张图象,通过像素相减求得图像间的差异,为后续识别和定位打下基础。图像相减在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_SIZECPException的异常。在图像尺寸不同的时候,我们需要先使用CBmpAdjustImageToEqualSize()函数将两幅图像的尺寸、颜色位数调整为相同大小,然后在通过上述方法即可实现不同尺寸的图像相减的功能。

             

              函数原型: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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464034.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 新系统易用性向 Windows 看齐

大家好,今天是一年一度的高考,不知道各位在多年以前有没有后悔选择电子专业,如果再给你一次机会,你会选择其他专业吗?以下是内容正文,由黄工整理!来源 | 网络嵌入式开发,很多工程师都…

深度剖析SOC高性能实时事件关联分析引擎

【引言】安全管理平台(SOC) 的一项关键技术就是事件关联分析。借助实时的事件关联分析引擎,安全管理平台能够发掘出复杂的海量安全日志和事件背后隐藏的信息,引导安全管理人员发现外 部***和内部违规行为。作为本系列的第五篇文章…

靠,嘉立创打板又降价

说个题外话,我前段时间和同事聊天,我同事是一个项目经理,我跟他说我有朋友在嘉立创,然后随口说了句,我们这个行业应该没有不知道嘉立创的吧,我同事回了一句,什么是嘉立创,然后我愣了…

拆解一个比亚迪的车钥匙,这个黑黑的元器件是什么?

今天抽屉突然找到一个比亚迪的车钥匙,寻思着没事拆开看看用什么方案做的。正面照,哪款车型的,不知道了背面照,很简洁,只有一个BYD的Logo接下来就是撬开了,过程非常顺利,之前撬开一个宝马车的钥匙…

分布式事物(同样适用于dubbo事务等分布式事务)

转载于:https://www.cnblogs.com/tian1993/p/10081901.html

一些web开发中常用的、做成cs文件的js代码 - 搜刮来的

using System;using System.Web;using System.Web.UI;namespace COCOWO.COMP{ /// <summary> /// 一些常用的Js调用 /// 创建时间&#xff1a;2006-8-3 /// 创建者&#xff1a;马先光 /// </summary> public class Jscript { …

库里扛起了勇士对凯尔特人的第四场

最近临近毕业季&#xff0c;有朋友这样说「我一定是要支持勇士的&#xff0c;毕竟库里和詹姆斯陪了整个大学四年啊」。昨晚上加班到11点半&#xff0c;到家洗完澡已经是凌晨1点了&#xff0c;那时候是想得很清楚的&#xff0c;明天是不想被其他事情打扰我看球赛的。这场比赛&am…

Nginx应用案例分享:压力测试

2019独角兽企业重金招聘Python工程师标准>>> 在运维工作中&#xff0c;压力测试是一项非常重要的工作。比如在一个网站上线之前&#xff0c;能承受多大访问量、在大访问量情况下性能怎样&#xff0c;这些数据指标好坏将会直接影响用户体验。 但是&#xff0c;在压力…

声音是什么?

转自博客园《【秒懂音视频开发】02_重识声音》&#xff0c;https://www.cnblogs.com/mjios/p/14466418.html#5035688#!comments声音的产生声音&#xff08;Sound&#xff09;&#xff0c;是由物体的振动产生的。一切正在发声的物体都在振动。我们说话的时候&#xff0c;是声带在…

[源码和文档分享]基于C语言的语法高亮设计与实现

一 需求分析 在所需高亮的关键字或字符串前后加上class标签&#xff0c;在css定义颜色。 二 程序设计 2.1 设计思路 把.html文件和.css文件中的内容存在两个字符数组中&#xff0c;在.cpp用文件操作写入。 2.2 文件组织架构 Syntax highlighting.exe所在目录为根目录 源代码命…

我愿为这二极管奉献我的一生

简 介&#xff1a; 利用二极管完成对信号的整流&#xff0c;求取绝对值等具有很多的应用。然而在小信号下&#xff0c;二极管的前向导通电压以及相应的杂散电容会对信号整流带来严重的影响。本文从“马场清太郎”所著的“运算放大器应用电路设计”中摘取了一些典型应用电路&…

【毕业设计】履带四足复合机器人

1.项目简介本项目中&#xff0c;履足式复合机器人拥有两种行进模式&#xff1a;四足行进模式、履带行进模式&#xff0c;应对不同场景及地形时能够切换形态。四足形态下整体总共拥有8个自由度DOF&#xff0c;单腿各具备2个自由度DOF&#xff0c;足端结构融入了履带机构&#xf…

c#: 任务栏进度显示(TaskbarManager)

Win7及以上系统支持任务栏进度条&#xff0c;为有进度类应用显示进度于任务栏&#xff0c;甚为方便。 以c#之WinForm实现其&#xff0c;大多采用Windows API Code Pack这个方案&#xff0c;加多引用&#xff0c;比较繁琐&#xff0c;而我总也打不开了其页面。 鄙人不喜欢多引用…

今天,过了27年后,IE浏览器停用了

前言随着Windows的官宣&#xff0c;ie浏览器将于6月16日正式退役。https://www.microsoft.com/zh-cn/download/internet-explorer.aspx那个曾几何时的浏览器之王&#xff0c;经历一次又一次操作系统的迭代&#xff0c;直至新兴浏览器的出现后沦为浏览器鄙视链的最后一层&#x…

boost库学习入门篇

学习及使用Boost库已经有一段时间了&#xff0c;Boost为我的日常开发中带来了极大的方便&#xff0c;也使得我越来越依赖于boost库了。但boost功能太多&#xff0c;每次使用还是得翻看以前的 资料&#xff0c;所以为了以后可以更方便的使用&#xff0c;在此对常用的功能作一个…

开源 STM32 USB-CAN项目

照理来说&#xff0c;USB-CAN这种东西应该已经被做的烂大街的工具&#xff0c;国内居然没有一个拿得出手的开源方案。某立功和PCAN动辄2000的价格也是离谱。淘宝上各种虚拟串口方案、替换dll兼容某立功软件的各种方案....价格都倒是便宜&#xff0c;性能和可靠性嘛.......就不多…

Go语言web框架 gin

Go语言web框架 GIN gin是go语言环境下的一个web框架, 它类似于Martini, 官方声称它比Martini有更好的性能, 比Martini快40倍, Ohhhh….看着不错的样子, 所以就想记录一下gin的学习. gin的github代码在这里: gin源码. gin的效率获得如此突飞猛进, 得益于另一个开源项目httproute…

8位ADC是256还是255?

昨天的文章发了之后&#xff0c;有朋友找到我&#xff0c;给我讨论了很多关于ADC细节。晚上给个朋友在51上调ADC0808芯片有一个朋友是做硬件的&#xff0c;他有从事过专业仪器设备&#xff0c;常年有使用ADC的经验&#xff0c;他给我的观点是&#xff0c;8位ADC对应的就是256。…

boost库在ubuntu下的安装

系统是ubuntu虚拟机&#xff0c;安装的是boost_1_60_0。 &#xff08;1&#xff09;首先去下载最新的boost代码包&#xff0c;网址www.boost.org。 &#xff08;2&#xff09;进入到自己的目录&#xff0c;解压&#xff1a; bzip2 -d boost_1_60_0.tar.bz2 tar xvf boost_1_…

所谓的0拷贝不就是为了让CPU休息吗?深入理解mmap

1.开场白环境&#xff1a;处理器架构&#xff1a;arm64内核源码&#xff1a;linux-5.11ubuntu版本&#xff1a;20.04.1代码阅读工具&#xff1a;vimctagscscope我们知道&#xff0c;linux系统中用户空间和内核空间是隔离的&#xff0c;用户空间程序不能随意的访问内核空间数据&…