Извлечение прямоугольной области пикселя из изображения

Мне нужно извлечь область пикселей, описанную (2n+1) x (2m+1) с центром на левом изображении (xl, yl). n и m являются входными параметрами пользователя, а xl и yl уже определены. Пока у меня есть этот код:

for(int xl = n; xl < picOneGreyScale.getWidth() - n; xl++) {
    for(int yl = m; yl < picOneGreyScale.getHeight() - m; yl++) {
        //extract (2n+1) x (2m+1) pixel region centred on leftimage (xl,yl);
        for(int nArea = xl-n; nArea < xl+n+1; nArea++) {
            for(int mArea = yl-m; mArea < yl+m+1; mArea++) {
                *code here*   
            }
}

Я не уверен, как продолжить. Я определил BufferedImage с именем leftRegion:

BufferedImage leftRegion = new BufferedImage((2*n+1),(2*m+1),BufferedImage.TYPE_BYTE_GRAY);

который я собираюсь использовать для «извлечения» моей пиксельной области. До сих пор я думал о том, где написано код здесь для извлечения пикселя в текущем местоположении (используя getRGB?), а затем вложения другого цикла for, чтобы поместить этот пиксель в правильные координаты x, y для левая обл. Однако я не уверен, как это сделать, или я думаю слишком сложно. В качестве альтернативы можно использовать getRGB с расширенными аргументами:

getRGB(int startX, int startY, int w, int h, int[] rgbArray, int offset, int scansize) 

вместо двух внутренних циклов for, но опять же я не очень разбираюсь в том, как это реализовать. Наконец, есть метод для BufferedImage, называемый copyData, который выглядит так, как будто он может быть уместным, но я не уверен, как его использовать. Каков наилучший способ реализовать это? Большое спасибо, как всегда.

Дополнительная информация:

Итак, я пытаюсь использовать метод getSubImage класса BufferedImage:

leftRegion = picOneGreyScale.getSubimage(xl, yl, (2*n+1), (2*m+1));

только я получаю сообщение об ошибке "(y + высота) находится за пределами растра". Как именно работает getSubImage? Будет ли изображение центрировано вокруг xl, yl с одинаковой шириной и высотой в обе стороны, или оно работает по-другому? Я даже следую правильному пути?


person cherryduck    schedule 18.11.2011    source источник
comment
Я также изучаю класс под названием CropImageFilter, я не знаю, будет ли это делать то, что мне нужно. Если кто-то может указать мне правильное направление, как это сделать, вы получите всю мою любовь. И бекон. * восклицание: бекон не может быть предоставлен   -  person cherryduck    schedule 18.11.2011


Ответы (1)


Я понял. Я просто заменил два внутренних цикла for на это:

leftRegion = picOneGreyScale.getSubimage(xl-n, yl-n, (2*n+1), (2*m+1));
person cherryduck    schedule 19.11.2011