图像缩减算法

时间:2015-08-07 08:37:45

标签: image-processing

有人知道微软在Paint中使用了哪些alogirhtm缩小图片范围?

我正在尝试开发一些软件(供个人使用)以缩减大量图片(使用Java)。使用"内置" java的功能是NearestNeighbor,Bilinear和Bicubic,结果质量很差......我使用的是Lanczos算法,它可以提供更好的结果,但没有达到MS Paint结果:/

注意:使用的Paint版本是Windows 7之一,我使用的Lanczos实现是Millie项目之一LanczosResamplePlugin.java 而builtins java来自Graphics2D:

    g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
    g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);

如果有人想要达到相同质量的结果,那将会有所帮助(对于我拍摄的图片,以及我的知识)。

这里有一些结果:

(我没有发布NN,双线性和双三次结果,结果质量很差)

Bellow a landscape(在谷歌图片上找到)。原始文件大小为1680x1050,并且草在原始文件中非常锐利(因此Paint结果似乎比Lanczos更好)。

可在此处查看原始图片:landscape-wallpaper-11a.jpg

Lanczos结果:

Lanczos landscape

vs Paint结果:

Paint landscape

另一张图片(人物照片),带有一些文字。您可以注意到,在Lanczos结果中,文本的可读性(不那么锐化)比在Paint结果中更少。此外,在黑色标题文本和带有白色文本的红色区域之间,在Lanczos结果中存在一些噪声,这在Paint结果中不存在。在底部,纸张上的网址在第一个结果上完全模糊/不可读,并且在Paint结果中可读。

Lanczos结果:

Lanczos cheese

vs Paint结果:

Paint chesse

我首先假设MS使用2种算法:1用于缩小,第2次用于锐化生成的图像?但是,由于最后一个示例中的底部网址仍然可读,因此可能不会因缩小结果而锐化......?

由于

修改

好吧,我有点愚蠢...图片上的噪音是由于jpeg压缩质量(保存图片时我的Java代码中没有设置)。

下面是png中的结果,因此没有噪音。但是结果仍然不能像油漆那样可读。

Lanczos cheese png

Lanczos cheese png

3 个答案:

答案 0 :(得分:2)

好的我想我已经拥有它了!

事实上,MS Paint(win7)中没有任何魔力。它必须使用众所周知的Lanczos算法来调整图像向下(和向上?),这似乎是最好的通用重采样算法(似乎在XnView中,我们可以选择重采样算法,它是默认选项)。 / p>

所以,我发现了另外两个java实现,每个实现都给出了不同的结果:

原始图片:landscape-wallpaper-11a.jpg

  1. 来自Milli项目的Lanczos here landscape Lanczos 1

  2. Lanczos来自“atyou”日本博客here landscape Lanczos 2

  3. Lanczos来自“zattonaka”日本博客here landscape Lanczos 3

  4. 来自MS Paint Win7的Algo(Lanczos?) landscape MS Paint

  5. 我的第二个结果集来自我的个人照片:

    1. 来自Milli项目here cheese Lanczos 1

    2. 来自“atyou”日本博客here cheese Lanczos 2

    3. 来自“zattonaka”日本博客here cheese Lanczos 3

    4. 来自MS Paint Win7的Algo(Lanczos?) cheese MS Paint

    5. 项目列表3中的结果似乎是与Paint结果最接近的结果(但不相同)。它具有清晰易读的文字(第二次测试)和锋利的草,如原始图像(第一次测试)。

      如前所述(编辑部分问题),Moreovoer噪音是由于保存时的jpeg压缩造成的。上面的结果是在PNG中,因此不会受到jpeg伪影压缩。

答案 1 :(得分:2)

MSPaint使用双线性插值然后使用卷积内核锐化图像:

0.0,-0.125,0.0

-0.125,1.5,-0.125

0.0,-0.125,0.0

ImageMagick命令:

magick image.png -scale 512 -morphology Convolve "3x3: 0.0, -0.125, 0.0 -0.125, 1.5, -0.125 0.0, -0.125, 0.0" image_resized.png

答案 2 :(得分:1)

与Alex所说的相反,我非常确定Paint使用GDI +提供的高质量双三次方法,而使用像Zattonaka这样的实现。您可以通过要求两者将一条扫描线的交替黑白扫描线的图像尺寸减小来判断。

在Paint中,黑白扫描线位于顶部和底部,但在中间淡入深灰色。

Zattonaka的实现保持了交替的黑白扫描线,但删除了一条扫描线。原因在于这段代码:

int bsx = (int)(dx / scale), bsy = (int)(dy / scale);

虽然这在人工条形码图像上给出了良好的结果,但它所做的实际上是最近邻近缩放,并且使用Lanczos预处理阶段进行了螺栓连接。有真实世界的图像,它的表现非常差,原因与最近邻居缩放不能很好地工作:它往往会削减细节。由于Lanczos的卷积,Zattonaka的实现并不像直接最近的邻居那么糟糕,但是有些图像仍然非常糟糕。

如果您正在寻找类似Paint所做的事情,那么最好尝试使用预先锐化的良好双三次插值器来抵消缩小模糊。你可能需要调整一下。