## 本文對濾鏡中常見的暈影,暈角效果的實現做了研究,具體如下:
## 1?暈影調整算法
所謂暈影就是給圖像四個角添加暗影效果,這暗影向圖像中心逐漸淡化。我們使用如下公式來實現:
假設圖像寬度高度分別為w,h:
~~~
double d = Math.Sqrt((i - w / 2) * (i - w / 2) + (j - h / 2) * (j - h / 2));
double dmax = 1.0 / Math.Sqrt(w * w / 4 + h * h / 4);
double lum = 0.75 / (1.0 + Math.Exp((d * dmax - cRadius) * cGradient)) + cLight;
//eg:double lum = 0.75 / (1.0 + Math.Exp((d * dmax - 0.85) * 5)) + 0.35;
r = (int)((double)r * lum);
g = (int)((double)g * lum);
b = (int)((double)b * lum);
~~~
注釋:
cRadius?(cRadius=0.73)這個參數控制暈影的半徑,值越大,半徑越大;
cLight?(cLight=0.25)控制中心圓形區域內的像素亮度,值越大,圖像越亮;
cGradient?(cGradient=20)這個參數控制中心區域與暈影過渡部分的梯度,值越小,過渡越自然,越不明顯;
上述算法實現的是圓形暈影。
有了暈影圖像之后,我們采用K比例混合算法來實現暈影強度的可調性,假設暈影圖像為S(n,m),原圖為X(n,m),效果圖為Y(n,m),暈影強度因子為K,K屬于[0,1],混合公式如下:
????????????????????Y(n,m)=K*X(n,m)+(1-K)*S(n,m)
這樣就實現了暈影效果從無到有的調節過程。
## 2?暈影調節快速算法
暈影調節的快速算法主要是改進暈影圖像的生成過程。我們可以按照自己的需求使用PS制作出一張暈影效果圖,來代替算法生成暈影圖像的過程,這樣就可以節省算法生成的時間了,之后的調節過程不變。
當然,這個算法的缺點就是暈影的半徑,過渡程度和亮度無法調整。
目前,這里給出Instagram里使用的暈角模板:
[](http://www.zealpixel.com/data/attachment/portal/201509/26/081917r0qevid2d1q3e3tt.png)
????在Instagram中,是使用這個模板與目標圖像執行“柔光”混合圖層算法,得到暈角效果的,然后使用1中的K比例混合算法,來快速調節。
最后給出android 中C代碼,可以直接使用。
## 附錄?Android?C?Code?with?RGB565
~~~
void THaloEffect(int* srcData, int width, int height) {
int gray = 0, green = 0, blue = 0, red = 0, i = 0, j = 0, alpha = 0xFF << 24;
for(j = 0; j < height; j++)
{
for(i = 0; i < width; i++)
{
gray = srcData[i + j * width];
red = ((gray >> 16) & 0xFF);
green = ((gray >> 8) & 0xFF);
blue = (gray & 0xFF);
double d = sqrt((i - width / 2) * (i - width / 2) + (j - height / 2) * (j - height / 2));
double dmax = 1.0 / sqrt(width * width / 4 + height * height / 4);
//double lum = 0.75 / (1.0 + Math.Exp((d * dmax - 0.73) * 20)) + 0.25;
double lum = 0.75 / (1.0 + exp((d * dmax - 0.73) * 20)) + 0.25;
red = (int)((double)red * lum);
red = CheckRange(red);
green = (int)((double)green * lum);
green = CheckRange(green);
blue = (int)((double)blue * lum);
blue = CheckRange(blue);
srcData[i + j * width] = alpha | (red << 16) | (green << 8) | blue;
}
}
};
void THaloEffect_F(int* srcData, int* mask, int width, int height, int ratio)
{
int gray = 0,green = 0,blue = 0,red = 0,i = 0, mRed = 0, mGreen = 0, mBlue = 0, alpha = 0xFF << 24;
int length = width * height;
for (i = 0; i < length; i++) {
gray = srcData[i];
red = ((gray >> 16) & 0xFF);
green = ((gray >> 8) & 0xFF);
blue = (gray & 0xFF);
gray = mask[i];
mRed = ((gray >> 16) & 0xFF);
mGreen = ((gray >> 8) & 0xFF);
mBlue = (gray & 0xFF);
mRed = ModeSmoothLight(red, mRed);
mGreen = ModeSmoothLight(green, mGreen);
mBlue = ModeSmoothLight(blue, mBlue);
red = (mRed * ratio + (100 - ratio) * red) / 100;
green = (mGreen * ratio + (100 - ratio) * green) / 100;
blue = (mBlue * ratio + (100 - ratio) * blue) / 100;
srcData[i] = alpha | (red << 16) | (green << 8) | blue;
}
};
~~~
- 前言
- 序言
- Brannan濾鏡
- 編碼基礎(Photoshop基礎變換的代碼實現)
- Toaster濾鏡
- Hudson濾鏡(Instagram)
- 暴雨濾鏡
- 大雪濾鏡
- 圖像濾鏡實現萬能方法研究
- 大霧效果濾鏡
- 連環畫濾鏡
- 暗調濾鏡
- 懷舊風格濾鏡
- (Nostalgla Filter)老照片濾鏡
- (Punch Filter)交叉沖印濾鏡
- (Lightleaks Filter)漏光濾鏡
- 漫畫濾鏡
- LOMO Filter
- Glow Filter發光濾鏡
- (Instagram)1977濾鏡
- (Sketch Filter)素描濾鏡
- 水彩畫濾鏡
- 圖像光照效果濾鏡
- Oilpaint油畫濾鏡
- Swirl濾鏡
- Wave濾鏡
- 球面(Spherize)濾鏡
- 擠壓(Pinch)濾鏡
- 旋轉模糊濾鏡
- 霓虹、浮雕、木刻濾鏡
- 圖像濾鏡暈影調節算法研究
- PS平均(濾鏡-模糊-平均)效果
- Photoshop實現Instagram Amaro濾鏡特效
- Photoshop實現Instagram之Nashville濾鏡
- Photoshop實現Instagram之Sierra濾鏡
- Photoshop實現Instagram之Mayfair濾鏡效果
- ZPhotoEngine超級算法庫
- 樂高像素拼圖特效
- 樂高像素拼圖特效濾鏡的代碼實現
- 保留細節的磨皮濾鏡之PS實現
- 保留細節的磨皮之C#程序實現
- 流行藝術風濾鏡特效PS實現
- PS圖層混合模式之明度模式