日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第五节 CImage和CBmp(二)

發(fā)布時間:2023/12/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第五节 CImage和CBmp(二) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

由于這個庫主要用于VC MFC下開發(fā)應(yīng)用,因此目前可以下載到版本只支持MFC開發(fā)。如果您需要標準Win32的庫,可以在回復(fù)時留下您的郵箱,或跟我聯(lián)系。

?????? Emailwuchunlei@163.com

?????? QQ819543772

EasyAnalysis圖像分析庫測試版以及源代碼下載地址:

下載地址:

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

190KB

本小節(jié)所涉及的源程序:

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

?

?

?????? 上面一個小節(jié)介紹了CBmpCImage中的基本功能,經(jīng)過閱讀和時間想必大家已經(jīng)對類的結(jié)構(gòu)和應(yīng)用有了大致的了解,這一小節(jié)主要介紹,CBmpCImage類中幾個比較實用的圖像處理功能。

?

一.圖像相減

楨差法是對運動物體定位的一種常用方法,通常使用連續(xù)捕獲到的兩到三張圖象,通過像素相減求得圖像間的差異,為后續(xù)識別和定位打下基礎(chǔ)。圖像相減在CBmp類中重載運算符“-”完成,由于任何一種圖像格式在做減法時都只有像素參與了運算,因此為了程序有良好的復(fù)用結(jié)構(gòu),具體像素之間的減法在CImage中實現(xiàn)。

1.? 相同尺寸圖像相減

函數(shù)聲明:CBmp operator-(CBmp &m_Bmp) throw();

返回值:CBmp

函數(shù)功能:重載運算符實現(xiàn)Bmp圖像相減

應(yīng)用舉例:

try

{?????????????????????????

??????? CBmp m_BmpBk;????????? //背景圖片

??????? CBmp m_BmpFk;????????? //前景圖片

??????? CBmp m_Bmp;??????????????????? //保存結(jié)果

???????

??????? 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());?????? //彈出錯誤信息

}

處理結(jié)果見下圖(上左:背景圖片? 上右:人物和背景? 下左:相減后的結(jié)果):

??

注:為了最大化的保留圖像相減后的信息,相減后取結(jié)果的絕對值。

?

2.? 不同尺寸的圖像相減

細心的朋友可能已經(jīng)發(fā)現(xiàn)了,上述圖像相減是在尺寸、顏色位數(shù)完全相同的情況下而做的。在圖像尺寸不同的時,如果直接應(yīng)用上述方法,程序會拋出一個異常代碼為ERR_NOT_EQUAL_SIZECPException的異常。在圖像尺寸不同的時候,我們需要先使用CBmpAdjustImageToEqualSize()函數(shù)將兩幅圖像的尺寸、顏色位數(shù)調(diào)整為相同大小,然后在通過上述方法即可實現(xiàn)不同尺寸的圖像相減的功能。

?????????????

????????????? 函數(shù)原型:static void AdjustImageToEqualSize(CBmp &m_BmpA,CBmp &m_BmpB)

返回值:靜態(tài)函數(shù),m_BmpA,m_BmpB即用于輸入原始圖像,又用于返回校調(diào)整好的圖像

函數(shù)功能:將圖像尺寸、顏色位數(shù)調(diào)整為相同的大小。調(diào)整原則:

I.?????????????? 取兩幅圖像中biHeight屬性大的值作為新圖像的biHeight

II.??????????? 取兩幅圖像中biWidth屬性大的值作為新圖像的biWidth

III.????????? 取兩幅圖像中biBitCount屬性大的值作為新圖像的biBitCount

IV.????????? 新圖像中像素矩陣坐標屬于原圖像的,直接叢原圖像中復(fù)制到新圖像中,否則新圖像中該位置像素補0

?

應(yīng)用舉例:

try

?????? {?????????????????????????

????????????? CBmp m_BmpA;??????????

????????????? CBmp m_BmpB;??????????

????????????? CBmp m_Bmp;??????????????????? //保存結(jié)果????

?????????????

????????????? m_BmpA.CreateImage("漢字.bmp");?????????? //通過文件初始化CBmp對象???????????

????????????? m_BmpB.CreateImage("人物.bmp");

?

????????????? CBmp::AdjustImageToEqualSize(m_BmpA,m_BmpB); //調(diào)整兩幅圖像尺寸

?

????????????? m_Bmp=m_BmpA-m_BmpB;???????????????????????????? //背景相減?????????????????????????

????????????? m_Bmp.SaveData("test2.bmp");

?????? }

?????? catch(CPException &err)

?????? {

????????????? int nErrCode=err.GetErrCode();?????????? //取錯誤類型代碼

????????????? MessageBox(err.GetErrMsg());?????? //彈出錯誤信息

?????? }

程序運行效果如下(上:原始圖片,下:相減后的圖片)

從運行結(jié)果可以看出,左上圖由于小于左上圖尺寸的位置補了零,因此上下兩幅圖像相減后大于左上圖尺寸的像素位置沒有變化,而兩幅圖像重疊的部分做了減法。

?

二.圖像相加:

圖像相加也是圖像分析技術(shù)中常用的操作之一,下面介紹EasyAnalysis庫中提供的圖像加法操作。

1.? 相同尺寸的圖像相加:

函數(shù)聲明:CBmp operator+CBmp &m_Bmp) throw();

返回值:CBmp

函數(shù)功能:重載運算符實現(xiàn)Bmp圖像相加

應(yīng)用舉例:

//相同尺寸的圖像加法

try

{?????????????????????????

??????? CBmp m_BmpA;??????????

??????? CBmp m_BmpB;??????????

??????? CBmp m_Bmp;??????????????????? //保存結(jié)果????

???????

??????? m_BmpA.CreateImage("人物.bmp");?????????? //通過文件初始化CBmp對象????

??????? m_BmpB.CreateImage("人物1.bmp");

??????? //CBmp::AdjustImageToEqualSize(m_BmpA,m_BmpB);????? //調(diào)整兩幅圖像尺寸

??????? m_Bmp=m_BmpA+m_BmpB;?????????????????????????????????? //圖像相加?????????????????????????

??????? m_Bmp.SaveData("test3.bmp");

}

catch(CPException &err)

{

??????? int nErrCode=err.GetErrCode();?????????? //取錯誤類型代碼

??????? MessageBox(err.GetErrMsg());?????? //彈出錯誤信息

}

運行結(jié)果如下(上:原始圖像,下:相加后的結(jié)果)

可以看出,通過上述操作,將兩幅圖像逐個像素平權(quán)的相加,是不是有點蒙太奇的效果:)

注:平權(quán)相加指兩幅圖像矩陣乘以一個相同的常數(shù)后再相加,為了不增加輸出圖像的總強度,因此重載運算符“+”實際上是實現(xiàn)將兩幅圖像同時乘以0.5,然后再相加。

2.? 不同尺寸的圖像相加:

圖像減法中不同尺寸相減可能用得較少,但是圖像加法中不同尺寸圖像加法用得相對來說就比較多了,最常見的就是為圖像增加數(shù)字水印。與圖像減法相同,如果圖像尺寸不同,那么同樣只需要使用AdjustImageToEqualSize()先將圖像尺寸調(diào)整一致,然后再行相加即可。下面給出了不同尺寸圖像加法的源代碼:

//不同尺寸的圖像加法

try

{?????????????????????????

??????? CBmp m_BmpA;??????????

??????? CBmp m_BmpB;??????????

??????? CBmp m_Bmp;??????????????????? //保存結(jié)果????

???????

??????? m_BmpA.CreateImage("人物.bmp");?????????? //通過文件初始化CBmp對象???????????

??????? m_BmpB.CreateImage("漢字.bmp");

?

??????? CBmp::AdjustImageToEqualSize(m_BmpA,m_BmpB); //調(diào)整兩幅圖像尺寸

?

??????? m_Bmp=m_BmpA+m_BmpB;?????????????????????????????????? //圖像相加?????????????????????????

??????? m_Bmp.SaveData("test4.bmp");

}

catch(CPException &err)

{

??????? int nErrCode=err.GetErrCode();?????????? //取錯誤類型代碼

??????? MessageBox(err.GetErrMsg());?????? //彈出錯誤信息

}

程序運行結(jié)果如下:

3.? 圖像的帶權(quán)相加

上面操作雖然將漢字和人物圖片重疊在同一幅圖片之上,但是由于重載操作符“+”是以0.5為系數(shù)的平權(quán)相加,因此圖像中漢字以外的區(qū)域由于補了0的緣故被削弱了一倍,顯然我們是不需要削弱這些部分的,為了解決這個問題,EasyAnalysis庫提供了一個更加靈活的函數(shù)AddImageByWeight()。

函數(shù)聲明:static CBmp AddImageByWeight(CBmp &m_BmpA,CBmp &m_BmpB,float fWA,float fWB)

返回值:CBmp

函數(shù)功能:靜態(tài)函數(shù),實現(xiàn)如下形式的圖像相加:

NewBmp=fWA*[m_BmpA]+fWB*[m_BmpB];

應(yīng)用舉例:

try

{?????????????????????????

??????? CBmp m_BmpA;??????????

??????? CBmp m_BmpB;??????????

??????? CBmp m_Bmp;??????????????????? //保存結(jié)果????

???????

??????? m_BmpA.CreateImage("人物.bmp");?????????? //通過文件初始化CBmp對象???????????

??????? m_BmpB.CreateImage("漢字.bmp");

?

??????? CBmp::AdjustImageToEqualSize(m_BmpA,m_BmpB); //調(diào)整兩幅圖像尺寸

?

??????? 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());?????? //彈出錯誤信息

}

從上圖可以看出,通過調(diào)整權(quán)值,輸出的圖像有了明顯的改善。雖然圖像比上面直接相減的效果好些,但是漢字部分始終有討厭的白色底色。在對EasyAnalysis庫的所有功能介紹完畢以后,我會在后面的高級應(yīng)用篇中介紹如何將漢字完美的添加到人物圖像中去。

轉(zhuǎn)載于:https://www.cnblogs.com/wude/archive/2007/10/25/1941634.html

總結(jié)

以上是生活随笔為你收集整理的第五节 CImage和CBmp(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。