图像处理之Lanczos采样放缩算法

一:什么是Lanczos采样

参见这里:http://en.wikipedia.org/wiki/Lanczos_resampling

二:大致算法流程

三:算法运行结果

1.向下采样, 生成缩略图, 左边为原图,右边为缩略图

向上采样,生成放大图像时效果:

算法源代码:

package com.gloomyfish.zoom.study; import java.awt.p_w_picpath.BufferedImage;
import java.awt.p_w_picpath.ColorModel; import com.gloomyfish.filter.study.AbstractBufferedImageOp; public class LanczosScaleFilter extends AbstractBufferedImageOp { // lanczos_size private float lanczosSize; private float destWidth; public LanczosScaleFilter() { lanczosSize = 3; destWidth = 100; } public LanczosScaleFilter(float lobes, int width) { this.lanczosSize = lobes; this.destWidth = width; } public void setLanczosSize(float size) { this.lanczosSize = size; } public void setDestWidth(float destWidth) { this.destWidth = destWidth; } @Override public BufferedImage filter(BufferedImage src, BufferedImage dest) { int width = src.getWidth(); int height = src.getHeight(); float ratio = width / this.destWidth; float rcp_ratio = 2.0f / ratio; float range2 = (float) Math.ceil(ratio * lanczosSize / 2); // destination p_w_picpath int dh = (int)(height * (this.destWidth/width)); int dw = (int)this.destWidth; if (dest == null) { ColorModel cMD = src.getColorModel(); dest = new BufferedImage(src.getColorModel(), cMD.createCompatibleWritableRaster(dw, dh), cMD.isAlphaPremultiplied(), null); } int[] inPixels = new int[width * height]; int[] outPixels = new int[dw * dh]; getRGB(src, 0, 0, width, height, inPixels); int index = 0; float fcy = 0, icy = 0, fcx = 0, icx = 0; for (int row = 0; row < dh; row++) { int ta = 0, tr = 0, tg = 0, tb = 0; fcy = (row + 0.5f) * ratio; icy = (float) Math.floor(fcy); for (int col = 0; col < dw; col++) { fcx = (col + 0.5f) * ratio; icx = (float) Math.floor(fcx); float sumred = 0, sumgreen = 0, sumblue = 0; float totalWeight = 0; for (int subcol = (int) (icx - range2); subcol <= icx + range2; subcol++) { if (subcol < 0 || subcol >= width) continue; int ncol = (int) Math.floor(1000 * Math.abs(subcol - fcx)); for (int subrow = (int) (icy - range2); subrow <= icy + range2; subrow++) { if (subrow < 0 || subrow >= height) continue; int nrow = (int) Math.floor(1000 * Math.abs(subrow - fcy)); float weight = (float) getLanczosFactor(Math.sqrt(Math.pow(ncol * rcp_ratio, 2) + Math.pow(nrow * rcp_ratio, 2)) / 1000); if (weight > 0) { index = (subrow * width + subcol); tr = (inPixels[index] >> 16) & 0xff; tg = (inPixels[index] >> 8) & 0xff; tb = inPixels[index] & 0xff; totalWeight += weight; sumred += weight * tr; sumgreen += weight * tg; sumblue += weight * tb; } } } index = row * dw + col; tr = (int) (sumred / totalWeight); tg = (int) (sumgreen / totalWeight); tb = (int) (sumblue / totalWeight); outPixels[index] = (255 << 24) | (clamp(tr) << 16) | (clamp(tg) << 8) | clamp(tb); // clear for next pixel sumred = 0; sumgreen = 0; sumblue = 0; totalWeight = 0; } } setRGB(dest, 0, 0, dw, dh, outPixels); return dest; } public static int clamp(int v) { return v > 255 ? 255 : (v < 0 ? 0 : v); } private double getLanczosFactor(double distance) { if (distance > lanczosSize) return 0; distance *= Math.PI; if (Math.abs(distance) < 1e-16) return 1; double xx = distance / lanczosSize; return Math.sin(distance) * Math.sin(xx) / distance / xx; } }

五:窗口大小对结果的影响

如果是向下采样生成缩略图的话, 窗口大小设置为3就已经非常清楚了

如果向上采样要放大图像的话, 窗口大小设置要大于6才能获得较好结果,推荐使用窗口

大小为8.

转载于:https://blog.51cto.com/gloomyfish/1400257

图像处理之Lanczos采样放缩算法相关推荐

  1. 图像处理之简单脸谱检测算法

    from: http://blog.csdn.net/jia20003/article/details/7596443 图像处理之简单脸谱检测算法(Simple Face Detection Algo ...

  2. Python-pcl 随机采样一致性算法

    RANSAC 随机采样一致性算法 RANSAC是一种随机参数估计算法.RANSAC从样本中随机抽选出一个样本子集,使用最小方差估计算法对这个子集计算模型参数,然后计算所有样本与该模型的偏差,在使用一个 ...

  3. PCL采样一致性算法

    在计算机视觉领域广泛的使用各种不同的采样一致性参数估计算法用于排除错误的样本,样本不同对应的应用不同,例如剔除错误的配准点对,分割出处在模型上的点集,PCL中以随机采样一致性算法(RANSAC)为核心 ...

  4. JavaScript实现图像处理----resizeImageWidth调整图像宽度算法(附完整源码)

    JavaScript实现图像处理----resizeImageWidth调整图像宽度算法(附完整源码) imageData.js完整源代码 resizeImageWidth.js完整源代码 image ...

  5. 【图像处理】——Python图像分割边缘检测算法之二阶梯度算子(laplace、log、dog算子)

    目录 一.二阶算子简介 二.laplace(拉普拉斯算子) 1.什么是拉普拉斯算子 (1)连续二维函数的二阶导 (2)离散二维函数的二阶导数 2.常用算子模块及代码 3.结果 三.log算子 1.什么 ...

  6. 【图像处理】——Python图像分割边缘检测算法之一阶梯度算子(Roberts、Prewitt、Sobel、 Kirsch、Canny算子)

    目录 前言 一.边缘检测算法 1.一阶算子 2.二阶算子 二.一阶算子 原图像lena 1.Roberts算子 不同方向的算子模板 梯度的计算 系统代码: 自定义函数代码 结果 2.Prewitt 不 ...

  7. Win8Metro(C#)数字图像处理--2.31灰度拉伸算法

    Win8Metro(C#)数字图像处理--2.31灰度拉伸算法 原文:Win8Metro(C#)数字图像处理--2.31灰度拉伸算法  [函数名称] 灰度拉伸函数GrayStretchProces ...

  8. PCL学习笔记5-sample consensus采样一致性算法

    PCL几种采样方法 - Being_young - 博客园 PCL常见采样方法 下采样 Downsampling 通过构造一个三维体素栅格,用每个体素内所有点的重心近似该体素其他点,达到滤波的效果,这 ...

  9. PCL学习:随机采样一致性算法(RANSAC)

    此文是在他人的文章上进行了补充完善.另外代码部分是在Ziv Yaniv的c++实现上重新实现了一次,加了中文注释,修正了一个错误.便于理解算法实现. 随机采样一致性算法,RANSAC是"RA ...

最新文章

  1. minio分布式集群示例: 4节点,每节点4块盘
  2. php sql注入判断,php防止sql注入漏洞过滤函数的代码
  3. mysql 5.5 替换字符_MySQL replace函数替换字符串语句的用法
  4. 数据科学 IPython 笔记本 9.6 聚合:最小、最大和之间的任何东西
  5. u-boot移植随笔:终于解决Nor Flash的问题了
  6. 给玩得好的女朋友写了一份前端学习路线。
  7. 电子计算机断层扫描仪,电子计算机X线断层扫描机CT的优缺点
  8. illegalargumentexception是什么异常_实战 | 统一异常处理介绍及实战
  9. Python str 与 bytes 类型(Python2/3 对 str 的处理)
  10. c语言libjpeg处理图像,解决使用 libjpeg 保存图片时因磁盘写入失败导致程序退出的有关问题...
  11. 照片审核处理工具_不需要Photoshop,这5款在线处理图片工具能帮你好好处理照片!...
  12. 兼容所有浏览器的快速Web打印控件下载
  13. 重装系统都杀不掉的十大病毒
  14. java连接hsql数据库_访问Hsql .data数据库文件
  15. correl函数相关系数大小意义_Excel使用Correl函数返回相关系数并确定属性关系的方法...
  16. wpf-折线图绘制2-oxyplot-1
  17. 交换机 VLAN 端口类型
  18. XPipe: Efficient Pipeline Model Parallelism for Multi-GPU DNN Training
  19. 安装教程之JDK下载与安装
  20. android 数据传递工具,AnyTrans for Android for Mac(安卓手机数据传输工具)

热门文章

  1. 【Audio】Unity音频模块:加载、转换、剪切、混音、合并
  2. Linux运维-服务器系统篇
  3. Mac 上使用 SAS 的 2 种方法
  4. Autofac程序集注入
  5. 【Redis集群专题】「集群技术三部曲」介绍一下常用的Redis集群机制方案的原理和指南(入门篇)
  6. 关于有偿提供拼图响应式后台的通知
  7. 如何做淘宝客推广淘宝客教程视频
  8. C++实现LR(1)分析表的构造
  9. require.js的用法:
  10. javax.servlet.ServletException: java.lang.NoSuchMethodError 解决方法解决办法