RGB模糊算法



我试图根据用户输入模糊图像。如果是1,则模糊图像将平均为3X3的正方形,并将其放入中间的正方形中。

P P P       All the pixels will be averaged and put into S.
P S P
P P P

我想我已经想出了一个正确的解决方案,它考虑到了边缘,但图像变成了完全黑色。有人能发现这个代码有问题吗?还是另一个问题?

int range = blur_slider.getValue();
for (int x = 0; x < source.getWidth(); x++) {
    for (int y = 0; y < source.getHeight(); y++) {
        double red_sum = 0.0;
        double green_sum = 0.0;
        double blue_sum = 0.0;
        // finds the min x and y values and makes sure there are no out of bounds exceptions
        int x_range_min = x - range;
        if (x_range_min < 0) {
            x_range_min = 0;
        }
        int x_range_max = x + range;
        if (x_range_max >= new_frame.getWidth()) {
            x_range_max = new_frame.getWidth() - 1;
        }
        int y_range_min = y - range;
        if (y_range_min < 0) {
            y_range_min = 0;
        }
        int y_range_max = y + range;
        if (y_range_max >= new_frame.getHeight()) {
            y_range_max = new_frame.getHeight() - 1;
        }
        // averages the pixels within the min and max values and puts it into the pixel at the center. copy new frame is the frame that has previous
        // work done on it, it is used so that new blur pixels that are set do not affect later pixels. new_frame is the main frame that will be set.
        for (int k = x_range_min; k < x_range_max; k++) {
            for (int j = y_range_min; j < y_range_max; j++) {
                Pixel p = copy_new_frame.getPixel(x, y);
                red_sum += p.getRed();
                green_sum += p.getGreen();
                blue_sum += p.getBlue();
            }
        }
        double num_pixels = x_range_max * y_range_max;
        ColorPixel tempPixel = new ColorPixel(red_sum / num_pixels, green_sum / num_pixels, blue_sum / num_pixels);
        new_frame.setPixel(x, y, tempPixel);
    }
}
frame_view.setFrame(new_frame);

是。像素数是而不是

double num_pixels = x_range_max * y_range_max;

你没有减去范围的最小值,所以你假设像素太多,然后除以一个太大的值。

已更正:

double num_pixels = (x_range_max - x_range_min) * (y_range_max - y_range_min);

@andy在代码中发现了另一个问题,这个问题可能不会导致黑色像素,但会导致你只取中间像素,而不是正方形中像素的平均值。

代码中还有另一个问题,导致它占用的区域比您预期的要小。

您应该将for循环更改为:

for (int k = x_range_min; k <= x_range_max; k++) {
    for (int j = y_range_min; j <= y_range_max; j++) {

并且您的像素数计算为:

double num_pixels = (x_range_max - x_range_min + 1) * (y_range_max - y_range_min + 1);

在当前的实现中,您缺少了最右边和最下面的像素。也就是说,你正在做这件事(在你申请了@andy的固定后——在此之前你只是拿了"s"):

P P
P S

我认为这是

Pixel p = copy_new_frame.getPixel(x,y);

应该是

Pixel p = copy_new_frame.getPixel(k,j);

相关内容

  • 没有找到相关文章

最新更新