天天看點

圖像處理------光源退化效果

基本思想:

rgb像素的亮度是由rgb各個分量值的大小決定的,分量越大,亮度越大。看上去

好像光照效果越明顯,光源退化效果是模拟光照在圖像的中心點上,慢慢擴散到周

圍,越靠近中心點像素,圖像越亮,越遠離圖像越暗。原理可以說是非常的簡單,

隻要計算圖像中每個像素到中心像素的歐幾裡德距離,歸一化以後得到scale值(0

到1之間)乘以原來的rgb像素值即得到每個像素處理以後的rgb像素值。

效果如下:

圖像處理------光源退化效果

關鍵代碼解釋:

中心像素點坐标取得:

int centerx = width/2;

int centery = height/2;

任意一個像素點到中心像素的距離計算:

double xx = (centerx - px)*(centerx - px);

double yy = (centery - py)*(centery - py);

return (int)math.sqrt(xx + yy);

距離歸一化以及衰減因子考慮:

double scale = 1.0 - getdistance(centerx, centery, col,row)/maxdistance;

for(int i=0; i<factor; i++) {

scale = scale * scale;

}

計算每個像素點的新rgb值:

tr = (int)(scale * tr);

tg = (int)(scale * tg);

tb = (int)(scale * tb);

濾鏡源代碼如下:

package com.gloomyfish.filter.study;  

import java.awt.image.bufferedimage;  

public class spotlightfilter extends abstractbufferedimageop {  

    // attenuation coefficient, default is 1 means line decrease...  

    private int factor;  

    public spotlightfilter() {  

        factor = 1;  

    }  

    public void setfactor(int coefficient) {  

        this.factor = coefficient;  

    @override  

    public bufferedimage filter(bufferedimage src, bufferedimage dest) {  

        int width = src.getwidth();  

        int height = src.getheight();  

        if ( dest == null )  

            dest = createcompatibledestimage( src, null );  

        int[] inpixels = new int[width*height];  

        int[] outpixels = new int[width*height];  

        getrgb( src, 0, 0, width, height, inpixels );  

        int index = 0;  

        int centerx = width/2;  

        int centery = height/2;  

        double maxdistance = math.sqrt(centerx * centerx + centery * centery);  

        for(int row=0; row<height; row++) {  

            int ta = 0, tr = 0, tg = 0, tb = 0;  

            for(int col=0; col<width; col++) {  

                index = row * width + col;  

                ta = (inpixels[index] >> 24) & 0xff;  

                tr = (inpixels[index] >> 16) & 0xff;  

                tg = (inpixels[index] >> 8) & 0xff;  

                tb = inpixels[index] & 0xff;  

                double scale = 1.0 - getdistance(centerx, centery, col, row)/maxdistance;  

                for(int i=0; i<factor; i++) {  

                    scale = scale * scale;  

                }  

                tr = (int)(scale * tr);  

                tg = (int)(scale * tg);  

                tb = (int)(scale * tb);  

                outpixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  

            }  

        }  

        setrgb( dest, 0, 0, width, height, outpixels );  

        return dest;  

    private double getdistance(int centerx, int centery, int px, int py) {  

        double xx = (centerx - px)*(centerx - px);  

        double yy = (centery - py)*(centery - py);  

        return (int)math.sqrt(xx + yy);  

}