• 图像处理------光源退化效果 分类: 视频图像处理 2015-07-24 14:53 30人阅读 评论(0) 收藏


    基本思想:

    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);

    滤镜源代码如下:

    1. package com.gloomyfish.filter.study;  
    2.   
    3. import java.awt.image.BufferedImage;  
    4.   
    5. public class SpotlightFilter extends AbstractBufferedImageOp {  
    6.     // attenuation coefficient, default is 1 means line decrease...  
    7.     private int factor;  
    8.     public SpotlightFilter() {  
    9.         factor = 1;  
    10.     }  
    11.       
    12.     public void setFactor(int coefficient) {  
    13.         this.factor = coefficient;  
    14.     }  
    15.   
    16.     @Override  
    17.     public BufferedImage filter(BufferedImage src, BufferedImage dest) {  
    18.         int width = src.getWidth();  
    19.         int height = src.getHeight();  
    20.   
    21.         if ( dest == null )  
    22.             dest = createCompatibleDestImage( src, null );  
    23.   
    24.         int[] inPixels = new int[width*height];  
    25.         int[] outPixels = new int[width*height];  
    26.         getRGB( src, 00, width, height, inPixels );  
    27.         int index = 0;  
    28.         int centerX = width/2;  
    29.         int centerY = height/2;  
    30.         double maxDistance = Math.sqrt(centerX * centerX + centerY * centerY);  
    31.         for(int row=0; row<height; row++) {  
    32.             int ta = 0, tr = 0, tg = 0, tb = 0;  
    33.             for(int col=0; col<width; col++) {  
    34.                 index = row * width + col;  
    35.                 ta = (inPixels[index] >> 24) & 0xff;  
    36.                 tr = (inPixels[index] >> 16) & 0xff;  
    37.                 tg = (inPixels[index] >> 8) & 0xff;  
    38.                 tb = inPixels[index] & 0xff;  
    39.                 double scale = 1.0 - getDistance(centerX, centerY, col, row)/maxDistance;  
    40.                 for(int i=0; i<factor; i++) {  
    41.                     scale = scale * scale;  
    42.                 }  
    43.   
    44.                 tr = (int)(scale * tr);  
    45.                 tg = (int)(scale * tg);  
    46.                 tb = (int)(scale * tb);  
    47.                   
    48.                 outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;  
    49.                   
    50.             }  
    51.         }  
    52.         setRGB( dest, 00, width, height, outPixels );  
    53.         return dest;  
    54.     }  
    55.       
    56.     private double getDistance(int centerX, int centerY, int px, int py) {  
    57.         double xx = (centerX - px)*(centerX - px);  
    58.         double yy = (centerY - py)*(centerY - py);  
    59.         return (int)Math.sqrt(xx + yy);  
    60.     }  
    61.   
    62. }  

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    hdu4273Rescue(三维凸包重心)
    hdu4449Building Design(三维凸包+平面旋转)
    hdu3847Trash Removal(凸包)
    CodeForces 166B (凸包)
    机器学习文章导航
    梯度下降法深入
    插值法
    离散系统频域分析
    离散系统时域分析
    连续系统频域分析
  • 原文地址:https://www.cnblogs.com/mao0504/p/4705510.html
Copyright © 2020-2023  润新知