интерполяция изображения - PullRequest
0 голосов
/ 03 декабря 2010

Привет, в моем проекте я хочу дать какое-то количество неподвижных изображений на этих изображениях, я должен взять перетасовываемые изображения в качестве входных данных, но результат будет похож на последовательные изображения, он может сравнивать ближайшего соседа, используя методы интерполяции. Как я могу реализовать Пожалуйста, скажите мне. У меня есть код, скажите мне, как он работает.

    public InterpolationMethod method = InterpolationMethod.Bilinear;
    public int newWidth = 0;
    public int newHeight = 0;
    try {
      this.newWidth = Math.Max(1, Math.Min(5000, int.Parse(widthBox.Text)));
      this.newHeight = Math.Max(1, Math.Min(5000, int.Parse(heightBox.Text)));
      this.method = (methodCombo.SelectedIndex == 0) 
        ? InterpolationMethod.NearestNeighbor 
        : (methodCombo.SelectedIndex == 1) 
            ? InterpolationMethod.Bilinear 
            : InterpolationMethod.Bicubic;
      this.DialogResult = DialogResult.OK;
      this.Close();
    }
    catch (Exception)
    {
      MessageBox.Show(this, "Incorrect values are entered", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

1 Ответ

0 голосов
/ 03 декабря 2010

Начните с интерполяции ближайшего соседа - это самое простое.По сути, этот подход работает следующим образом:

  • Выделите память для вашего нового изображения (очевидно, если это еще не сделано для вас)
  • Переберите все пиксели вашего нового изображения.Вы можете сделать это любым удобным для вас способом, но наиболее распространенный способ называется «обходом строки сканирования» или «растровым сканированием» - вы сначала читаете по столбцам, а когда добираетесь до последнего столбца, перемещаетесь вниз по строке ивернитесь к первому столбцу.
    • В каждой позиции пикселя (row, col) установите соответствующую позицию (row_o, col_o) на старом изображении.Например, если старое изображение в два раза меньше, то row_o = row/2 и col_o = col/2.Обратите внимание, что, поскольку все позиции в пикселях являются целыми числами, потребуется некоторое округление.С интерполяцией ближайшего соседа это неизбежное зло, и вы не можете избежать его.
    • Захватить значение пикселя в позиции (row_o, col_o) на старом изображении
    • Назначить это значение новому изображению в позиции (row, col)

Как только вы уберете это с пути, другие подходы должны иметь больше смысла.

Обход сканирования:

for (i=0; i < image.height; ++i)
for (j=0; j < image.width;  ++j)
{
    // Do stuff here
}

Как это выглядит:

alt text

...