图像处理之水纹效果

简介: 图像处理之水纹效果

主要思想:


主要是利用三角正弦函数与余弦函数的变换效果,完成对像素的位移变换,产生


水纹效果,因为自然界中的水纹多少都是正弦波或者余弦波的叠加效果。


参数解析:


支持两个输入参数设置,一个是波长,表示像素位移的多少,另外一个是周期


表示正弦或者余弦函数的在像素中的变换周期。


关键程序解析:


计算位移与周期变化代码如下:

xoffset = (int)((double)wave * Math.sin(2.0 * Math.PI * (float)row / period));
yoffset = (int)((double)wave * Math.cos(2.0 * Math.PI * (float)col / period));

程序效果: 1341840405_7452.png


程序源代码:

package com.gloomyfish.filter.study;
 
import java.awt.image.BufferedImage;
 
public class WaterFilter extends AbstractBufferedImageOp {
  
  private double wave;
  private double period;
  
  public WaterFilter() {
    wave = 25.0;
    period = 128;
  }
  
  public void setPeriod(double period) {
    this.period = period;
  }
  
  public void setWave(double nWave) {
    this.wave = nWave;
  }
 
  @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];
        Point[][] ssPixels = new Point[height][width];
        getRGB( src, 0, 0, width, height, inPixels );
        int index = 0, index2 = 0;
        int xoffset = 0, yoffset = 0;
        for(int row=0; row<height; row++) {
          for(int col=0; col<width; col++) {
                xoffset = (int)((double)wave * Math.sin(2.0 * Math.PI * (float)row / period));
                yoffset = (int)((double)wave * Math.cos(2.0 * Math.PI * (float)col / period));
                xoffset = xoffset + col;
                yoffset = yoffset + row;
                if(xoffset < 0 || xoffset >=width) {
                  xoffset = 0;
                }
                if(yoffset < 0 || yoffset >=height) {
                  yoffset = 0;
                }
                
                // save the 2D coordinate newX, and newY
                ssPixels[row][col] = new Point(xoffset, yoffset); 
          }
        }
        
        // coordinate 2D result and fill the pixels data.
        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;
            index2 = ssPixels[row][col].getRow() * width + ssPixels[row][col].getCol();
            ta = (inPixels[index2] >> 24) & 0xff;
                tr = (inPixels[index2] >> 16) & 0xff;
                tg = (inPixels[index2] >> 8) & 0xff;
                tb = inPixels[index2] & 0xff;
                outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
          }
        }
        setRGB( dest, 0, 0, width, height, outPixels );
        return dest;
  }
  
  class Point {
    private int x;
    private int y;
    
    public Point(int x, int y) {
      this.x = x;
      this.y = y;
    }
    
    public int getRow() {
      return this.y;
    }
    
    public int getCol() {
      return this.x;
    }
    
  }
 
}

转载文章请注明出自本博客

相关文章
|
算法 数据库 计算机视觉
Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略
Dataset之COCO数据集:COCO数据集的简介、下载、使用方法之详细攻略
|
8月前
|
编解码 计算机视觉
YOLOv11改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLOv11-T !!! 最新的发文热点
YOLOv11改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLOv11-T !!! 最新的发文热点
1255 7
YOLOv11改进策略【YOLO和Mamba】| 替换骨干 Mamba-YOLOv11-T !!! 最新的发文热点
|
8月前
|
SQL JSON 数据可视化
基于 DIFY 的自动化数据分析实战
本文介绍如何使用DIFY搭建数据分析自动化流程,实现从输入需求到查询数据库、LLM分析再到可视化输出的全流程。基于经典的employees数据集和DIFY云端环境,通过LLM-SQL解析、SQL执行、LLM数据分析及ECharts可视化等模块,高效完成数据分析任务。此方案适用于人力资源分析、薪酬管理等数据密集型业务,显著提升效率并降低成本。
12591 16
|
机器学习/深度学习 JSON 算法
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
4254 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
|
11月前
|
关系型数据库 MySQL 索引
MySQL的group by与count(), *字段使用问题
正确使用 `GROUP BY`和 `COUNT()`函数是进行数据聚合查询的基础。通过理解它们的用法和常见问题,可以有效避免查询错误和性能问题。无论是在单列分组、多列分组还是结合其他聚合函数的场景中,掌握这些技巧和注意事项都能大大提升数据查询和分析的效率。
977 0
|
SQL 分布式计算 大数据
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
大数据-97 Spark 集群 SparkSQL 原理详细解析 Broadcast Shuffle SQL解析过程(一)
261 0
|
12月前
|
数据采集 存储 JavaScript
Dynamic Website 爬虫:应对动态内容与 JavaScript 渲染挑战
本文深入探讨了如何设计针对动态网站的爬虫,以采集 WIPO Brand Database 中的专利和技术信息。文章详细介绍了动态网站的挑战,包括 JavaScript 渲染、反爬虫机制和异步加载,并提出了解决方案,如使用 Selenium 模拟浏览器、代理 IP 技术和 API 抓取。最后,通过具体代码示例展示了如何实现这些技术手段。
658 0
|
算法 计算机视觉
图像处理之水波纹扩散效果(water ripple effect)
图像处理之水波纹扩散效果(water ripple effect)
356 5
|
Ubuntu Python
全网最简约的Vscode配置Anaconda环境(百分百成功)
全网最简约的Vscode配置Anaconda环境(百分百成功)
30077 0
全网最简约的Vscode配置Anaconda环境(百分百成功)
|
机器学习/深度学习 人工智能 自然语言处理
CopyNet、SeqGAN、BERTSUM…你都掌握了吗?一文总结文本摘要必备经典模型(三)
CopyNet、SeqGAN、BERTSUM…你都掌握了吗?一文总结文本摘要必备经典模型
437 0