PhotoShop算法實(shí)現(xiàn)進(jìn)階-模糊濾鏡-運(yùn)動(dòng)模糊(二十四)
來源:程序員人生 發(fā)布時(shí)間:2014-12-18 08:46:56 閱讀次數(shù):3777次
PhotoShop算法實(shí)現(xiàn)進(jìn)階-模糊濾鏡-運(yùn)動(dòng)模糊(2104)
kezunhai@gmail.com
http://blog.csdn.net/kezunhai
造成圖象退化或說使圖象模糊的緣由有很多種,如果是由于在攝像時(shí)相機(jī)和被攝景物之間有相對(duì)運(yùn)動(dòng)而釀成的圖象模糊則稱為運(yùn)動(dòng)模糊。所得到圖象中的景物常常會(huì)模糊不清,我們稱之為運(yùn)動(dòng)模糊圖象。運(yùn)動(dòng)模糊(Motion Blur)是1種抓取物體運(yùn)動(dòng)狀態(tài)效果的濾鏡,主要利用物體運(yùn)動(dòng)時(shí)暴光的攝影手法,摹擬出在攝像中拍攝運(yùn)動(dòng)物體的間接暴光功能,從而使圖象產(chǎn)生出1種動(dòng)態(tài)效果。它通經(jīng)常使用來制造物體掠過或移動(dòng)的效果。
實(shí)現(xiàn)原理:運(yùn)動(dòng)模糊濾鏡沿特定的方向,并以特定的強(qiáng)度進(jìn)行模糊處理。首先,在數(shù)學(xué)上,Y軸向上為正,而在圖象處理中,Y軸向下為正,所以在獲得用戶指定方向角度后,應(yīng)先將其沿正方形旋轉(zhuǎn)180°;接著,解決圖象在指定方向上的位移問題。運(yùn)動(dòng)莫不是簡(jiǎn)單地將圖象在指定的圖象上移來移去,而是在距離限定的范圍內(nèi),按某種方式復(fù)制并疊加像素。簡(jiǎn)單地可以看成,將1幅圖象的多張副本疊放在指定的方向上,然后取其平均值;最后,要解決的問題就是圖象的透明度,處理Alpha分類,這樣終究產(chǎn)生的模糊效果才更理想。
實(shí)現(xiàn)算法:
// 添加運(yùn)動(dòng)模糊效果
// angle:運(yùn)動(dòng)的方向, distance:運(yùn)動(dòng)的距離
// 這里只是粗略的計(jì)算,以dx的長(zhǎng)度為準(zhǔn),也能夠以dy或dx+dy等長(zhǎng)度為準(zhǔn)
// 如果需要更精確的計(jì)算,請(qǐng)參考有關(guān)專業(yè)文獻(xiàn)
void PhotoShop::MotionBlur(Mat& img, Mat& dst, int angle/* =30 */, int distance/* =100 */)
{
angle = angle%360;
if ( distance <1 ) distance = 1;
if ( distance > 200) distance = 200;
double radian = ((double)angle+180.0)/180.0*PI; // 角度轉(zhuǎn)弧度
int dx = (int)((double)distance* cos(radian)+0.5);
int dy = (int)((double)distance* sin(radian)+0.5);
int sign;
if ( dx<0) sign = ⑴;
if ( dx>0) sign = 1;
int height = img.rows;
int width = img.cols;
int chns = img.channels();
if (dst.empty())
dst.create(height, width, img.type());
int i,j ,k, i0, j0, p, sum, count;
for ( i=0; i<height; i++)
{
unsigned char* dstData = (unsigned char*)dst.data + dst.step*i;
for ( j=0; j<width; j++)
{
for ( k=0; k<chns; k++)
{
sum = 0, count =0;
for ( p=0; p<abs(dx); p++)
{
i0 = i + p*sign;
j0 = j + p*sign;
if ( i0>=0 && i0<height && j0>=0 && j0<width)
{
count++;
sum += getPixel(img, i0, j0, k);
}
}
if ( count == 0)
{
dstData[j*chns+k] = getPixel(img, i, j, k);
}
else
{
dstData[j*chns+k] = saturate_cast<uchar>(sum/(double)count+0.5);
}
}// for k
} // for j
}
}
測(cè)試效果(angle=60, distance = 50):

再來張女神的最愛:

下面這篇文章詳細(xì)介紹了運(yùn)動(dòng)模糊,有興趣的讀者可以參考:
1、甚么是運(yùn)動(dòng)模糊(Motion Blur)
2、 高質(zhì)量單幅圖片運(yùn)動(dòng)去模糊
作者:kezunhai 出處:http://blog.csdn.net/kezunhai 歡迎轉(zhuǎn)載或分享,但請(qǐng)務(wù)必聲明文章出處。
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)