VC++编程实现对曝光不足照片的修复
2010-06-15 20:39:54 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鐐劤缂嶅﹪寮婚悢鍏尖拻閻庨潧澹婂Σ顔剧磼閻愵剙鍔ょ紓宥咃躬瀵鎮㈤崗灏栨嫽闁诲酣娼ф竟濠偽i鍓х<闁诡垎鍐f寖闂佺娅曢幑鍥灳閺冨牆绀冩い蹇庣娴滈箖鏌ㄥ┑鍡欏嚬缂併劎绮妵鍕箳鐎n亞浠鹃梺闈涙搐鐎氫即鐛崶顒夋晬婵絾瀵ч幑鍥蓟閻斿摜鐟归柛顭戝枛椤牆顪冮妶搴′簼缂侇喗鎸搁悾鐑藉础閻愬秵妫冮崺鈧い鎺戝瀹撲礁鈹戦悩鎻掝伀缁惧彞绮欓弻娑氫沪閹规劕顥濋梺閫炲苯澧伴柟铏崌閿濈偛鈹戠€n€晠鏌嶆潪鎷屽厡闁汇倕鎳愮槐鎾存媴閸撴彃鍓卞銈嗗灦閻熲晛鐣烽妷褉鍋撻敐搴℃灍闁绘挻娲橀妵鍕箛闂堟稐绨肩紓浣藉煐濮樸劎妲愰幘璇茬闁冲搫鍊婚ˇ鏉库攽椤旂》宸ユい顓炲槻閻g兘骞掗幋鏃€鐎婚梺瑙勬儗閸樺€熲叺婵犵數濮烽弫鍛婃叏椤撱垹纾婚柟鍓х帛閳锋垶銇勯幒鍡椾壕缂備礁顦遍弫濠氱嵁閸℃稒鍊烽柛婵嗗椤旀劕鈹戦悜鍥╃У闁告挻鐟︽穱濠囨嚃閳哄啰锛滈梺褰掑亰閸欏骸鈻撳⿰鍫熺厸閻忕偟纭堕崑鎾诲箛娴e憡鍊梺纭呭亹鐞涖儵鍩€椤掑啫鐨洪柡浣圭墪閳规垿鎮欓弶鎴犱桓闂佸湱枪閹芥粎鍒掗弮鍫熷仺缂佸顕抽敃鍌涚厱闁哄洢鍔岄悘鐘绘煕閹般劌浜惧┑锛勫亼閸婃牠宕濋敃鈧…鍧楀焵椤掍胶绠剧€光偓婵犱線鍋楀┑顔硷龚濞咃絿妲愰幒鎳崇喓鎷犻懠鑸垫毐闂傚倷鑳舵灙婵炲鍏樺顐ゆ嫚瀹割喖娈ㄦ繝鐢靛У绾板秹寮查幓鎺濈唵閻犺櫣灏ㄥ銉р偓瑙勬尭濡繂顫忛搹鍦<婵☆垰鎼~宥囩磽娴i鍔嶉柟绋垮暱閻g兘骞嬮敃鈧粻濠氭偣閸パ冪骇鐎规挸绉撮—鍐Χ閸℃ê闉嶇紓浣割儐閸ㄥ墎绮嬪澶嬪€锋い鎺嶇瀵灝鈹戦埥鍡楃仯闁告鍕洸濡わ絽鍟崐鍨叏濡厧浜鹃悗姘炬嫹

最后需要将变换后的结果保存到DIB中,这部分处理过程相对比较简单,只需根据计算出来的映射关系表按图索骥,就可把原始密集分布的灰度值映射到经过均衡化的新灰度级上,从而扩大了灰度级之间的距离,改善了视觉效果:
for (i = 0; i < lHeight; i ++)
{
for (j = 0; j < lWidth * 3; j ++)
{
//对R分量进行灰度映射(均衡化)
unsigned char R = *((unsigned char *)lpDIBBits + lWidth * 3 * i + j);
*((unsigned char *)lpDIBBits + lWidth * 3 * i + j) = nNs_R[R];
j++;
//对G分量进行灰度映射(均衡化)
unsigned char G = *((unsigned char *)lpDIBBits + lWidth * 3 * i + j);
*((unsigned char *)lpDIBBits + lWidth * 3 * i + j) = nNs_G[G];
j++;
//对B分量进行灰度映射(均衡化)
unsigned char B = *((unsigned char *)lpDIBBits + lWidth * 3 * i + j);
*((unsigned char *)lpDIBBits + lWidth * 3 * i + j) = nNs_B[B];
}
}
下图是经过上述方法处理而得到的修复图象,从修复后的照片可以清晰地看到条幅上的六个大字以及照片上的其他一些诸如印章、落款等细节。对修复后的照片进行灰度分布统计,可从右下的灰度分布图中看到原本密集分布在0 ~ 100 之间的象素灰度分布现在已被均匀扩展到40 ~ 255之间的区域,而且由于高亮度象素的分布密度相对较大,因此经过修复的照片图象整体显得较为明亮,也即对拍照时由于缺乏闪光灯而造成的暴光不足等缺陷做了成功的弥补。
结论
本文通过对曝光不足的原始照片采取灰度均衡化处理而使其在一定程度上得到了修复,使一些原本看不见的细节在经过修复处理后变的清晰可见。经笔者多次实验,本文所介绍的方法对于曝光不足的照片有很好的修复效果,同时对从事图像开发、数码相片处理软件的开发人员有很好的实用价值。本文给出的程序代码在Windows 98下由Microsoft Visual C++ 6.0编译通过。
更多精彩
赞助商链接