2016-02-24 4 views
0

В настоящее время я работаю над проектом, который требует, чтобы я читал изображения и увеличивал их.Ближайшая соседка к билинейной интерполяции

В настоящее время я использую алгоритм ближайшего соседа для увеличения изображения, но я пытаюсь использовать билинейную интерполяцию и трудно реализовать ее.

Вот мой текущий NN Алгоритм:

public void doThumbnailResize() { 
    resizedImage = new BufferedImage(55, 55, BufferedImage.TYPE_3BYTE_BGR); 
    int h = resizedImage.getHeight(), h2 = image1.getHeight(); 
    int w = resizedImage.getWidth(), w2 = image1.getWidth(); 
    for (int j = 0; j < h; j++) { 
     for (int i = 0; i < w; i++) { 
      float y = j * ((float) h2/(float) h); 
      float x = i * ((float) w2/(float) w); 
      resizedImage.setRGB(i, j, image1.getRGB((int) x, (int) y)); 
     } 
    } 
    image_icon.setIcon(new ImageIcon(resizedImage));   
} 

Я найти его трудно найти материал в Интернете, и было интересно, если кто-то может мне точку в правильном направлении, и, возможно, некоторые псевдокод.

Заранее спасибо.

ответ

0

Билинейная интерполяция в основном работает при интерполяции квадрата в 4 пикселя. Сначала вы должны искать ближайшего соседа, то есть, какой исходный пиксель отображает целевой пиксель, и местоположение относительно этого пикселя. Затем вы создаете ящик размером в один пиксель размером и высоту и проверяете, какие пиксели будут пересекаться (до 4) и вычислить отношение этого перекрытия к размеру окна. Затем этот процент будет применен к цвету и будет добавлен к окончательному цвету.

Пример:

Предположим, мы имеем 9x9 изображение, как это (каждый символ означает пиксель):

ABC 
DEF 
GHI 

Теперь мы хотим увеличить, что 4x4 и вычислить интерполяции первого пикселя (0/0):

  • относительный размер целевого пикселя (3/4,3/4), т.е. каждый целевой пиксель охватывает 0,75 ширину и высоту исходного пиксела
  • пиксель A охватывает координаты текстуры (0,0) - (0,333,0,333)
  • наш первый центр пикселя цели был бы равен (0.125,0.125) (1/ширина * 0,5, 1/высота * 0,5) и, таким образом, цель (0.0, 0.0) до (0.25.0.25)
  • , как вы можете видеть, наш первый целевой пиксель полностью лежит в исходном пикселе A и, следовательно, получает цвет A.

Теперь для второго пикселя (1/0):

  • центра второго целевого пикселя будет в (0.375,0.125) и, таким образом, охватывает координаты (0.25,0.0) до (0,5, 0.25)
  • , как вы можете увидеть это будет перекрывать исходные пиксели A, B, D и Е
  • область нашей целевой коробки 0,25 * 0,25 = 0,0625
  • площадь перекрытия с а (0.333- 0,25) * (0,25-0) ~ 0,02075
  • , таким образом, около 33% поля нашего целевого пикселя перекрываются с A
  • перекрытие для B будет ((0.5-0333) * (0.25 - 0))/0.0625 ~ = 67%
  • цвет нашего целевого пикселя, таким образом, 33% цвет A + 67% цвет B

Рассмотрим еще один пиксель, на этот раз (1/1):

  • перекрытие для А будет: ((0,333 - 0,25) * (0,333 - 0,25))/0,0625 ~ = 11%
  • перекрытие для B будет: ((0.5-0.333) * (0,333 - 0,25))/0,0625 ~ = 22%
  • перекрытие для D будет: ((0,333-0,25) * (0,5-0,333))/0,0625 ~ = 22%
  • перекрытие для E будет: ((0.5-0.333) * (0.5-0.333))/0.0625 ~ = 45%
  • цвет мишени (1/1) будет таким образом составлять 11% A + 22 % B + 22% D + 45% E
+0

Хорошо спасибо, я подожду примера, прежде чем задавать любые вопросы. Еще раз спасибо. –