3

我有一个项目,我必须以多种方式处理图像。我被困在像素化上。

对于像素化,我必须采用一组 10x10 的像素并返回一个单元格,该单元格分别平均了 RGB 颜色。目前,我得到的只是跑步者程序中的红色图像。谢谢您的帮助。

public static Photograph pixelated(Photograph photo) {
        int red = 0;
        int green = 0;
        int blue = 0;
        int interval = 10;
        Photograph p = null;
        p = new Photograph(photo.getWidth(),photo.getHeight());
        for (int row=0; row<photo.getHeight(); row +=interval) {
            for (int col=0; col<photo.getWidth(); col +=interval) {

                for (int row2=row; row2<row+10; row2++) {
                    for (int col2=col; col2<col+10; col2++) {
                    red = red + photo.getPixel(col, row).getRed();
                    green = green + photo.getPixel(col, row).getGreen();
                    blue = blue + photo.getPixel(col, row).getBlue();   
                    }
                }
            red = red / interval;
            green = green / interval;
            blue = blue / interval;

            Pixel rgb = new Pixel(red,green,blue);
            for (int row3=0; row<interval; row++) {
                for (int col3=0; col<interval; col++) {
                    p.setPixel(col3, row3, rgb);
        }}}}
        return p;
        } 
4

1 回答 1

0

你有几个错误在那里。您不会在每个块之间重置红色绿色蓝色值,良好的做法是仅将变量用于所需的范围。

间歇性地使用间隔。

此外,正如指出的那样,您没有正确获得平均值,您可能还需要考虑舍入问题,此代码会截断。

需要注意的一件事是,红绿蓝有时可能是整数,有时是浮点数,如果你把它们混合起来,你会遇到问题。

public static Photograph pixelated(Photograph photo) {
    int interval = 10;
    Photograph p = null;
    p = new Photograph(photo.getWidth(),photo.getHeight());
    for (int row=0; row<photo.getHeight(); row +=interval) {
        for (int col=0; col<photo.getWidth(); col +=interval) {
            // declare and reset variables here
            int red = 0;
            int green = 0;
            int blue = 0;

            for (int row2=row; row2<row+interval; row2++) {
                for (int col2=col; col2<col+interval; col2++) {
                    // i assume these functiosn return an int 0 <= x < 256 ?
                    red = red + photo.getPixel(col, row).getRed();
                    green = green + photo.getPixel(col, row).getGreen();
                    blue = blue + photo.getPixel(col, row).getBlue();   
                }
            }
            // you have a square not a line
            red = red / (interval * interval);
            green = green / (interval * interval);
            blue = blue / (interval * interval);

            // i assume this constructor takes ints 0 <= x < 256 ?
            Pixel rgb = new Pixel(red,green,blue);
            // interval needs to be used here
            for (int row3=row; row3< row+interval; row3++) {
                for (int col3=col; col3<col+interval; col3++) {
                    p.setPixel(col3, row3, rgb);
                }
            }
        }
    }
    return p;
} 
于 2013-03-14T04:41:16.977 回答