第五节 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(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 将解决方案和项目放在同一目录中_借助CA
- 下一篇: python代码画皮卡丘_程序员式优雅表