【问题标题】:Java Dithering not workingJava 抖动不起作用
【发布时间】:2023-04-08 08:18:01
【问题描述】:

我正在尝试在 java 中实现 Floyd-Steinberg 算法,但我仍然有一些错误?!在我的代码中我无法解决。也许你们中的一些人有一个建议我如何解决这个问题。

方法如下

 public DitheringGUI dith(String fileName) {
DitheringGUI g = new DitheringGUI(fileName);

for(int y = 0 ; y<g.img.getHeight();y++){
    for(int x = 0 ; x < g.img.getWidth();x++){

    Color oldColor = g.img.getColor(x, y);
    Color newColor = palette(oldColor);

    g.img.set(x, y, newColor);



    int quant_Error = oldColor.getRed() - newColor.getRed();


    if(x+1 < g.img.getWidth()) {
        g.img.set(x+1,y,new Color(  g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
            g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
            g.img.getColor(x+1, y).getRed()+quant_Error*(7/16)));
    }


    if(x-1 >=0 && y+1 <g.img.getHeight()){
        g.img.set(x-1,y+1,new Color(    g.img.getColor(x-1, y+1).getRed()+quant_Error*(3/16),
            g.img.getColor(x-1, y+1).getRed()+quant_Error*(3/16),
            g.img.getColor(x-1, y+1).getRed()+quant_Error*(3/16)));
    }

    if(y+1 < g.img.getHeight()){
        g.img.set(x,y+1,new Color(  g.img.getColor(x, y+1).getRed()+quant_Error*(5/16),
            g.img.getColor(x, y+1).getRed()+quant_Error*(5/16),
            g.img.getColor(x, y+1).getRed()+quant_Error*(5/16)));

    }



    if(x+1 < g.img.getWidth() && y+1 < g.img.getHeight()){
        g.img.set(x+1,y+1,new Color(    g.img.getColor(x+1, y+1).getRed()+quant_Error*(1/16),
            g.img.getColor(x+1, y+1).getRed()+quant_Error*(1/16),
            g.img.getColor(x+1, y+1).getRed()+quant_Error*(1/16)));
    }

    }
}
return g;
}

实际的问题是它只是黑白而不是抖动,这意味着没有灰度。

我的输入是这样的:http://www.directupload.net/file/d/3985/spd2k9wq.png

我的输出是:http://www.directupload.net/file/d/3985/s24rq7qo.png

请注意,“抖动”图像​​过度抖动并且几乎是黑色的。

【问题讨论】:

  • 链接到示例输入和预期输出可能非常有用。
  • 在错误分布之后,您的颜色分量可能会溢出,这可能会导致不正确的结果。当您创建new Color 时,最好测试该值是否落入 0..255 范围内。问题也可能在palette 方法内部。请将其添加到帖子中。
  • 私人调色板(颜色 oldColor){ int avg =oldColor.getRed(); int BoW = avg
  • @lolio:我尝试将您的图片添加到您的问题正文中,如果您的声誉足够高,这是首选的方法。不过也有问题。该网站似乎不允许直接链接到图像或拖放。我只是在您的问题中添加了链接。下次请使用其他图片网站,例如 imgur,

标签: java math dithering


【解决方案1】:

你正在做整数除法:7/163/165/161/16...

这些除法的结果是0,而不是某个分数。

确保使用浮点数,例如:7.0 / 163.0 / 16 等。

【讨论】:

  • 当我将其更改为浮点数时,我得到:线程“main”中的异常 java.lang.IllegalArgumentException:颜色参数超出预期范围:红绿蓝
【解决方案2】:

我想我看到了错误,它可能属于剪切粘贴类型:

在每个代码的if 块中,您只能调用getRed() 而永远不会调用getGreen90getBlue()。请在下面的块中查看此内容:(重新格式化以使问题更容易发现。

if(x+1 < g.img.getWidth()) {
    g.img.set(x+1,y,new Color(  
        g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
        g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
        g.img.getColor(x+1, y).getRed()+quant_Error*(7/16)));
}                              /\/\/\/\
                                 here   

这个和你的其他块不应该是这样的吗:

if(x+1 < g.img.getWidth()) {
    g.img.set(x+1,y,new Color(  
        g.img.getColor(x+1, y).getRed()+quant_Error*(7/16),
        g.img.getColor(x+1, y).getGreen()+quant_Error*(7/16),
        g.img.getColor(x+1, y).getBlue()+quant_Error*(7/16)));
} 

我猜你已经很接近了,你得到的图像看起来像这样的原因是因为只有 RGB 光谱的红色部分正在被评估。

【讨论】:

  • Paul 是对的,但我这样做是因为我只有灰色,这意味着红色绿色和蓝色是相同的。仍然感谢
  • @lolio - 嗯。我没有假设,但这是有道理的。您是否可能需要不同版本的算法,因为您实现的算法仅考虑 RGB 颜色?
猜你喜欢
  • 2015-10-19
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2017-02-20
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
相关资源
最近更新 更多