Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

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

Delphi , Графика и Игры , Изображения

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



- Как повысить pождаемость на планете?
- Заставить Microsoft выпускать пpезеpвативы!

Этот алгоритм увеличивает изображение в произвольное количество раз при помощи билинейной интерполяции. При создании нового изображения каждой его точке с целыми координатами (x,y) сопоставляется точка исходного изображения с дробными координатами (xo, yo), xo=x/dx, yo=y/dy (dx и dy – коэффициенты увеличения). Далее нужно провести поверхность через точки, лежащие вокруг (xo, yo). Цвет здесь рассматривается как третье измерение. На поверхности ищется точка с координатами (xo, yo) и ее цвет понимается за цвет точки (x,y) получаемого изображения.

Этот алгоритм хорошо работает при целых или больших коэффициентах увеличения. Но резкие границы размываются. Для уменьшения изображения этот алгоритм также не подходит.


procedure Interpolate(var bm: TBitMap; dx, dy: single);
var
  bm1: TBitMap;
  z1, z2: single;
  k, k1, k2: single;
  x1, y1: integer;
  c: array [0..1, 0..1, 0..2] of byte;
  res: array [0..2] of byte;
  x, y: integer;
  xp, yp: integer;
  xo, yo: integer;
  col: integer;
  pix: TColor;
begin
  bm1 := TBitMap.Create;
  bm1.Width := round(bm.Width * dx);
  bm1.Height := round(bm.Height * dy);
  for y := 0 to bm1.Height - 1 do
  begin
    for x := 0 to bm1.Width - 1 do
    begin
      xo := trunc(x / dx);
      yo := trunc(y / dy);
      x1 := round(xo * dx);
      y1 := round(yo * dy);

      for yp := 0 to 1 do
        for xp := 0 to 1 do
        begin
          pix := bm.Canvas.Pixels[xo + xp, yo + yp];
          c[xp, yp, 0] := GetRValue(pix);
          c[xp, yp, 1] := GetGValue(pix);
          c[xp, yp, 2] := GetBValue(pix);
        end;

      for col := 0 to 2 do
      begin
        k1 := (c[1,0,col] - c[0,0,col]) / dx;
        z1 := x * k1 + c[0,0,col] - x1 * k1;
        k2 := (c[1,1,col] - c[0,1,col]) / dx;
        z2 := x * k2 + c[0,1,col] - x1 * k2;
        k := (z2 - z1) / dy;
        res[col] := round(y * k + z1 - y1 * k);
      end;
      bm1.Canvas.Pixels[x,y] := RGB(res[0], res[1], res[2]);
    end;
    Form1.Caption := IntToStr(round(100 * y / bm1.Height)) + '%';
    Application.ProcessMessages;
    if Application.Terminated then
      Exit;
  end;
  bm := bm1;
end;

const
  dx = 5.5;
  dy = 5.5;

procedure TForm1.Button1Click(Sender: TObject);
const
  w = 50;
  h = 50;
var
  bm: TBitMap;
  can: TCanvas;
begin
  bm := TBitMap.Create;
  can := TCanvas.Create;
  can.Handle := GetDC(0);
  bm.Width := w;
  bm.Height := h;
  bm.Canvas.CopyRect(Bounds(0, 0, w, h), can, Bounds(0, 0, w, h));
  ReleaseDC(0, can.Handle);
  Interpolate(bm, dx, dy);
  Form1.Canvas.Draw(0, 0, bm);
  Form1.Caption := 'x: ' + FloatToStr(dx) +
  ' y: ' + FloatToStr(dy) +
  ' width: ' + IntToStr(w) +
  ' height: ' + IntToStr(h);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  bm: TBitMap;
begin
  if OpenDialog1.Execute then
    bm.LoadFromFile(OpenDialog1.FileName);
  Interpolate(bm, dx, dy);
  Form1.Canvas.Draw(0, 0, bm);
  Form1.Caption := 'x: ' + FloatToStr(dx) +
  ' y: ' + FloatToStr(dy) +
  ' width: ' + IntToStr(bm.Width) +
  ' height: ' + IntToStr(bm.Height);
end;

Перевод контента на русский язык:

Алгоритм билинейной интерполяции Алгоритм работает, найдя четыре ближайших пикселя в оригинальном изображении, соответствующие целевому пикселю в resized-изображении. Затем он рассчитывает interpolated-цветовое значение с помощью следующей формулы: res[col] = round(y * k + z1 - y1 * k) где col - компонента цвета (R, G или B), y - координата Y целевого пикселя, k - склонение прямой между соседними пикселями в направлении X, а z1 - interpolated-значение на текущей координате Y.

Улучшения Чтобы увеличить качество resized-изображения, можно рассмотреть следующие улучшения: 1. Использование болееadvanced-алгоритма интерполяции: билинейная интерполяция может производить размытые результаты, особенно при ресайзе больших изображений. Вы можете использовать болееadvanced-алгоритм, например, алгоритм bicubic или Lanczos. 2. Анти-алиасинг: чтобы уменьшить эффект aliasing, можно применять анти-алиасинговые техники, такие как Gaussian-blurring или anisotropic-filtering. 3. Ошибка диффузии: эта техника может помочь уменьшить потерю деталей в resized-изображении, разбросив ошибку между пикселями. 4. Многопоточность: если вы ресайзите большие изображения, можно использовать многопоточность для параллелизации обработки и улучшения производительности.

Обзор кода Предоставленный код кажется хорошим началом, но есть несколько минимальных проблем:

  • Процедура Interpolate создает новый объект TBitMap и присваивает его оригинальному изображению. Это неэффективно и может привести к паметным проблемам.
  • Код использует GetRValue, GetGValue и GetBValue для извлечения компонентов цвета из пикселей, что может быть медленным. Вы можете использовать одиночную функцию или цикл для извлечения всех компонентов цвета одновременно.
  • Процедура Button1Click создает новый объект TCanvas и присваивает его основному форм-канвасу. Это не нужно и может привести к паметным проблемам.

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

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


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




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


:: Главная :: Изображения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-01-28 06:54:48/0.0037100315093994/0