如何在java中设置任何图像的阈值(用于黑白分色)?

如何在java中设置任何图像的阈值(用于黑白分色)?,java,image,png,jpeg,Java,Image,Png,Jpeg,已解决:问题是“jpeg压缩”。另存为“.png”有效 我用java中的canny过滤器程序检测到了图像的边缘。 应用过滤器后 如果放大。。。 它们都有不同的黑白色调。 我希望所有边缘像素都是纯白色(#FFFFFF),其余部分是黑色 注意:除了上面的(#F7F7F7)之外,不同的像素可能具有不同的色调。上面的缩放图像只是一个例子 编辑: 我写这段代码是为了在图像上生效 public void convert(){ try{ BufferedImage img = Im

已解决:问题是“jpeg压缩”。另存为“.png”有效

我用java中的canny过滤器程序检测到了图像的边缘。 应用过滤器后

如果放大。。。

它们都有不同的黑白色调。
我希望所有边缘像素都是纯白色(#FFFFFF),其余部分是黑色

注意:除了上面的(#F7F7F7)之外,不同的像素可能具有不同的色调。上面的缩放图像只是一个例子

编辑: 我写这段代码是为了在图像上生效

public void convert(){
    try{
        BufferedImage img = ImageIO.read(new File("input.jpg"));
        int rgb;
        int height = img.getHeight();
        int width = img.getWidth();
        File f = new File("newThreshold.jpg");
        Color white = new Color(255,255,255);
        int wh = white.getRGB();

        for (int h = 0; h<height; h++){
            for (int w = 0; w<width; w++){  

                rgb = img.getRGB(w, h);
                red = (rgb & 0x00ff0000) >> 16;
                green = (rgb & 0x0000ff00) >> 8;
                blue  =  rgb & 0x000000ff;
                if(red >= 200 || blue >= 200 || green >= 200){
                     img.setRGB(w,h,wh);
                }
            }
        }

        ImageIO.write(img,"jpg",f);
    }
    catch(Exception e){
    }
}
public void convert(){
试一试{
buffereImage img=ImageIO.read(新文件(“input.jpg”);
int rgb;
int height=img.getHeight();
int width=img.getWidth();
文件f=新文件(“newThreshold.jpg”);
白色=新颜色(255255);
int wh=white.getRGB();
对于(inth=0;h16;
绿色=(rgb&0x0000ff00)>>8;
蓝色=rgb&0x000000ff;
如果(红色>=200 | |蓝色>=200 | |绿色>=200){
img.setRGB(w,h,wh);
}
}
}
ImageIO.write(img,“jpg”,f);
}
捕获(例外e){
}
}
即使在运行代码之后,我的图像也没有变化。
即使红色、绿色和蓝色的值高于200,我的图像也不会改变。


更新:将图像保存为“.png”而不是“.jpg”有效!

您可以检查图像中的每个像素,并确定其是否高于某个阈值(如果将其值设置为纯白色)。如果需要,您还可以对较暗的区域执行相同操作

例如:

public Image thresholdWhite(Image in, int threshold)
{
    Pixel[][] pixels = in.getPixels();
    for(int i = 0; i < pixels.length; ++i)
    {
        for(int j = 0; j < pixels[i].length; ++j)
        {
            byte red = pixels[i][j].getRed();
            byte green = pixels[i][j].getGreen();
            byte blue = pixels[i][j].getBlue();
            /* In case it isn't a grayscale image, if it is grayscale this if can be removed (the block is still needed though) */
            if(Math.abs(red - green) >= 16 && Math.abs(red - blue) >= 16 && Math.abs(blue- green) >= 16)
            {
                if(red >= threshold || blue >= threshold || green >= threshold)
                {
                    pixels[i][j] = new Pixel(Colors.WHITE);
                }
            }
        }
    }
    return new Image(pixels);
}
公共图像阈值白色(图像输入,整数阈值)
{
像素[][]像素=in.getPixels();
用于(int i=0;i=16&&Math.abs(红-蓝)>=16&&Math.abs(蓝-绿)>=16)
{
如果(红色>=阈值| |蓝色>=阈值| |绿色>=阈值)
{
像素[i][j]=新像素(颜色.白色);
}
}
}
}
返回新图像(像素);
}

你能告诉我如何找到阈值吗?找到图像每个像素的rgb值后我该怎么做?@DHS阈值是捕获所有白色瓷砖的任何值,我会从240开始。找到rgb值后,你所要做的就是将其颜色更改为纯白色或
0xFFFFFF
。你确定吗这不仅仅是因为jpeg压缩?试着将其保存为
.png
,然后看看。这几乎肯定是由于压缩。jpeg似乎不喜欢微小的细节。是的,我将其保存为png,它工作了!谢谢大家