图像处理------光束效果

简介: <p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height: 26px;"><strong>原理:</strong></p><p style="color: rgb(51, 51, 51); font-family: Arial; font-size: 14px; line-height

原理:

光束滤镜,对一幅图像完成光束效果,好似有一束光从图像本身激发出来,按照一定的角度

散发开来,光束滤镜是一种图像叠加效果,首先要借助于之前的完成的移动模糊滤镜,将一

幅图像按照一定的阈值二值化以后,加以移动模糊滤镜,将移动模糊之后的图像和原图像叠

加就产生了光束滤镜效果。

 

对光束滤镜而言,其最终效果除了移动模糊的三个参数以外,还取决于以下两个参数:

a.      图像RGB阈值的选取,建议可以直方图以后选取,程序以threshold表示

b.      光强度大小的值的选取,程序中以strength表示

 

程序运行效果如下:


关键代码解析:

计算RGB阈值代码如下– 输入的阈值范围为[0,1]

intthreshold3 = (int)(threshold*3*255);

 

求取二值像素的代码如下:

int l = r + g + b;

if (l < threshold3)

    [x] =0xff000000;

else {

l /= 3;

pixels[x] = a | (l << 16) | (l << 8) | l;

}

像素叠加乘以强度系数的代码如下(其中r,g,b分别代表RGB的三个颜色分量值):

r = PixelUtils.clamp((int)(r * strength) + r2);

g = PixelUtils.clamp((int)(g * strength) + g2);

b = PixelUtils.clamp((int)(b * strength) + b2);

光束滤镜的完全源代码如下:

[java]  view plain copy
  1. <span style="font-weight: normal;">/* 
  2. ** Copyright 2012 @gloomyfish. All rights reserved. 
  3. */  
  4.   
  5. package com.process.blur.study;  
  6.   
  7. import java.awt.image.BufferedImage;  
  8.   
  9. public class LaserFilter extends MotionFilter {  
  10.   
  11.     private float threshold = 0.5f;  
  12.     private float strength = 0.8f;  
  13.   
  14.     public LaserFilter() {  
  15.     }  
  16.   
  17.     public void setThreshold( float threshold ) {  
  18.         this.threshold = threshold;  
  19.     }  
  20.       
  21.     public float getThreshold() {  
  22.         return threshold;  
  23.     }  
  24.       
  25.     public void setStrength( float strength ) {  
  26.         this.strength = strength;  
  27.     }  
  28.       
  29.     public float getStrength() {  
  30.         return strength;  
  31.     }  
  32.       
  33.     public BufferedImage filter( BufferedImage src, BufferedImage dst ) {  
  34.         int width = src.getWidth();  
  35.         int height = src.getHeight();  
  36.         int[] pixels = new int[width];  
  37.         int[] srcPixels = new int[width];  
  38.   
  39.         BufferedImage laserImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);  
  40.   
  41.         int threshold3 = (int)(threshold*3*255);  
  42.         for ( int y = 0; y < height; y++ ) {  
  43.             getRGB( src, 0, y, width, 1, pixels );  
  44.             for ( int x = 0; x < width; x++ ) {  
  45.                 int rgb = pixels[x];  
  46.                 int a = rgb & 0xff000000;  
  47.                 int r = (rgb >> 16) & 0xff;  
  48.                 int g = (rgb >> 8) & 0xff;  
  49.                 int b = rgb & 0xff;  
  50.                 int l = r + g + b;  
  51.                 if (l < threshold3)  
  52.                     pixels[x] = 0xff000000;  
  53.                 else {  
  54.                     l /= 3;  
  55.                     pixels[x] = a | (l << 16) | (l << 8) | l;  
  56.                 }  
  57.             }  
  58.             setRGB( laserImg, 0, y, width, 1, pixels );  
  59.         }  
  60.   
  61.         laserImg = super.filter(laserImg, null );  
  62.           
  63.         for ( int y = 0; y < height; y++ ) {  
  64.             getRGB( laserImg, 0, y, width, 1, pixels );  
  65.             getRGB( src, 0, y, width, 1, srcPixels );  
  66.             for ( int x = 0; x < width; x++ ) {  
  67.                 int rgb = pixels[x];  
  68.                 int a = rgb & 0xff000000;  
  69.                 int r = (rgb >> 16) & 0xff;  
  70.                 int g = (rgb >> 8) & 0xff;  
  71.                 int b = rgb & 0xff;  
  72.                   
  73.                 int rgb2 = srcPixels[x];  
  74.                 // int a2 = rgb2 & 0xff000000;  
  75.                 int r2 = (rgb2 >> 16) & 0xff;  
  76.                 int g2 = (rgb2 >> 8) & 0xff;  
  77.                 int b2 = rgb2 & 0xff;  
  78.                   
  79.                 if ( r > 0 ) {  
  80.                     r = clamp((int)(r * strength) + r2);  
  81.                     g = clamp((int)(g * strength) + g2);  
  82.                     b = clamp((int)(b * strength) + b2);  
  83.                 } else {  
  84.                     r = r2;  
  85.                     g = g2;  
  86.                     b = b2;  
  87.                 }  
  88.   
  89.                 rgb = a | (r << 16) | (g << 8) | b;  
  90.                 pixels[x] = rgb;  
  91.             }  
  92.             setRGB( laserImg, 0, y, width, 1, pixels );  
  93.         }  
  94.   
  95.         return laserImg;  
  96.     }  
  97.       
  98.     public String toString() {  
  99.         return "Light/Laser...";  
  100.     }  
  101. }  
  102. </span>  
相关文章
|
人工智能 文字识别 监控
将人工智能融入多媒体 助力视频产业加速——阿里云视频AI全能力解读
结合人工智能视频理解流程和用户的需求场景,我们将视频AI的功能分成四个大部分,视频智能审核、视频内容理解、视频智能编辑、视频版权保护。其中视频审核功能包括视频鉴黄、暴恐涉政识别、广告二维码识别、无意义直播识别等,利用识别能力将网络上没营养和不健康的视频内容进行排查和处理;视频理解功能包括视频分类、标签,人物识别、语音识别,同时也包括对视频中的文字进行识别(OCR);视频编辑层面可以实现视频首图、视频摘要、视频highlight的生成,同时支持新闻拆条;关于视频版权,支持视频相似性、同源视频检索和音视频指纹等功能。
17748 0
将人工智能融入多媒体 助力视频产业加速——阿里云视频AI全能力解读
|
测试技术 API Docker
使用ruri快速构建跨架构chroot容器
【8月更文挑战第22天】本指南介绍如何使用 ruri 工具快速构建跨架构 chroot 容器。首先需安装 ruri,并确保系统满足安装要求。接着确定目标架构(如从 x86 到 ARM),并准备好相应的工具链和依赖库。利用 ruri 的命令行工具启动容器构建流程,指定源与目标架构及基础镜像。构建完成后可进一步配置和定制容器,安装所需软件包与调整系统设置。随后通过运行测试用例验证容器功能,解决发现的问题。最后将测试合格的容器部署至生产环境,利用容器管理工具进行管理和运行。在整个过程中要注意架构间的差异与兼容性问题,并确保系统环境稳定,定期更新 ruri 和相关组件。
266 5
|
11月前
|
缓存 Kubernetes 容灾
如何基于服务网格构建高可用架构
分享如何利用服务网格构建更强更全面的高可用架构
|
监控 安全 API
什么是 API?
API 即应用程序编程接口(Application Programming Interface),它是一组定义了软件组件之间如何交互的规则和协议。可以将 API 想象成一个服务的 “窗口”,通过这个窗口,不同的软件程序可以相互通信、共享数据和功能。 例如,当你使用手机上的天气应用时,这个应用可能会通过调用气象部门提供的 API 来获取实时的天气数据。
10157 12
|
监控 关系型数据库 应用服务中间件
zabbix自定义监控、钉钉、邮箱报警
zabbix自定义监控、钉钉、邮箱报警,实验准备,安装,添加监控对象,添加自定义监控项,监控mariadb,监控NGINX,钉钉报警设置,邮件报警
671 0
|
前端开发 搜索推荐 UED
单页面应用(SPA)与多页面应用(MPA)的区别及优缺点
单页面应用(SPA)与多页面应用(MPA)的区别及优缺点
385 1
|
Oracle 关系型数据库 数据库
❤️Docker中只需2步即可拥有Oracle 10G环境,史上最快部署❤️
❤️Docker中只需2步即可拥有Oracle 10G环境,史上最快部署❤️
1576 1
❤️Docker中只需2步即可拥有Oracle 10G环境,史上最快部署❤️
|
编译器 C语言 C++
Visual Studio 2019 解决scanf函数报错问题
Visual Studio 2019 解决scanf函数报错问题 系列文章 第一篇:Visual Studio 2019 详细安装教程(图文版) 第二篇:Visual Studio 2019 实用功能设置(背景颜色,代码颜色及行号设置) 第三篇:Visual Studio 2019 代码调试技巧 第四篇:Visual Studio 2019 解决scanf 警告问题
414 0
|
网络架构
运营必备 - PV、UV、IP 分别是什么意思?
运营必备 - PV、UV、IP 分别是什么意思?
4527 0
运营必备 - PV、UV、IP 分别是什么意思?