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

Сделать изображение более четким

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

Сделать изображение более четким

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

procedure Sharpen(sbm, tbm: TBitmap; alpha: Single);
 //to sharpen, alpha must be >1. 
//pixelformat pf24bit 
//sharpens sbm to tbm 
var
   i, j, k: integer;
   sr: array[0..2] of PByte;
   st: array[0..4] of pRGBTriple;
   tr: PByte;
   tt, p: pRGBTriple;
   beta: Single;
   inta, intb: integer;
   bmh, bmw: integer;
   re, gr, bl: integer;
   BytesPerScanline: integer;

 begin
   //sharpening is blending of the current pixel 
  //with the average of the surrounding ones, 
  //but with a negative weight for the average 
  Assert((sbm.Width > 2) and (sbm.Height > 2), 'Bitmap must be at least 3x3');
   Assert((alpha > 1) and (alpha < 6), 'Alpha must be >1 and <6');
   beta := (alpha - 1) / 5; //we assume alpha>1 and beta<1 
  intb := round(beta * $10000);
   inta := round(alpha * $10000); //integer scaled alpha and beta 
  sbm.PixelFormat := pf24bit;
   tbm.PixelFormat := pf24bit;
   tbm.Width := sbm.Width;
   tbm.Height := sbm.Height;
   bmw := sbm.Width - 2;
   bmh := sbm.Height - 2;
   BytesPerScanline := (((bmw + 2) * 24 + 31) and not 31) div 8;

   tr := tbm.Scanline[0];
   tt := pRGBTriple(tr);

   sr[0] := sbm.Scanline[0];
   st[0] := pRGBTriple(sr[0]);
   for j := 0 to bmw + 1 do
   begin
     tt^ := st[0]^;
     inc(tt); inc(st[0]); //first row unchanged 
  end;

   sr[1] := PByte(integer(sr[0]) - BytesPerScanline);
   sr[2] := PByte(integer(sr[1]) - BytesPerScanline);
   for i := 1 to bmh do
   begin
     Dec(tr, BytesPerScanline);
     tt := pRGBTriple(tr);
     st[0] := pRGBTriple(integer(sr[0]) + 3); //top 
    st[1] := pRGBTriple(sr[1]); //left 
    st[2] := pRGBTriple(integer(sr[1]) + 3); //center 
    st[3] := pRGBTriple(integer(sr[1]) + 6); //right 
    st[4] := pRGBTriple(integer(sr[2]) + 3); //bottom 
    tt^ := st[1]^; //1st col unchanged 
    for j := 1 to bmw do
     begin
     //calcutate average weighted by -beta 
      re := 0; gr := 0; bl := 0;
       for k := 0 to 4 do
       begin
         re := re + st[k]^.rgbtRed;
         gr := gr + st[k]^.rgbtGreen;
         bl := bl + st[k]^.rgbtBlue;
         inc(st[k]);
       end;
       re := (intb * re + $7FFF) shr 16;
       gr := (intb * gr + $7FFF) shr 16;
       bl := (intb * bl + $7FFF) shr 16;

     //add center pixel weighted by alpha 
      p := pRGBTriple(st[1]); //after inc, st[1] is at center 
      re := (inta * p^.rgbtRed + $7FFF) shr 16 - re;
       gr := (inta * p^.rgbtGreen + $7FFF) shr 16 - gr;
       bl := (inta * p^.rgbtBlue + $7FFF) shr 16 - bl;

     //clamp and move into target pixel 
      inc(tt);
       if re < 0 then
         re := 0
       else
         if re > 255 then
           re := 255;
       if gr < 0 then
         gr := 0
       else
         if gr > 255 then
           gr := 255;
       if bl < 0 then
         bl := 0
       else
         if bl > 255 then
           bl := 255;
       //this looks stupid, but avoids function calls 

      tt^.rgbtRed := re;
       tt^.rgbtGreen := gr;
       tt^.rgbtBlue := bl;
     end;
     inc(tt);
     inc(st[1]);
     tt^ := st[1]^; //Last col unchanged 
    sr[0] := sr[1];
     sr[1] := sr[2];
     Dec(sr[2], BytesPerScanline);
   end;
   // copy last row 
  Dec(tr, BytesPerScanline);
   tt := pRGBTriple(tr);
   st[1] := pRGBTriple(sr[1]);
   for j := 0 to bmw + 1 do
   begin
     tt^ := st[1]^;
     inc(tt); inc(st[1]);
   end;
 end;

Обзор кода на языке Delphi для алгоритма шарпенирования изображения.

Обзор Процедура Sharpen принимает три параметра: sbm и tbm, которые представляют собой объекты TBitmap, отображающие входное и выходное изображения соответственно; а также alpha, одиночный плавающий десятичный знак, контролирующий количество шарпенирования.

Предусловия 1. Входное изображение (sbm) должно иметь ширину и высоту больше 2. 2. Параметр alpha должен быть между 1 и 5 (включительно).

Алгоритм Код реализует простой алгоритм шарпенирования, который смешивает текущий пиксель с средним значением его окружающих пикселей, взвешенным отрицательным значением (-beta). Это делается для подчеркивания различий между соседними пикселями, что в результате дает изображение, которое кажется более четким. Шаг за шагом алгоритм выглядит следующим образом: 1. Инициализируются переменные: beta вычисляется из alpha, а целочисленные версии beta и alpha хранятся в inta и intb соответственно. 2. Установка выходного изображения (tbm) с темиже шириной, высотой и форматом пикселей, что входное изображение (sbm). 3. Итерация по каждому ряду пикселей в изображении: * Для первого ряда копируются пиксели из входного изображения в выходное изображение без изменения. * Для последующих рядов вычисляется среднее значение цвета окружающих пикселей (верх, лев, центр, правый и нижний) с помощью взвешенного суммирования с отрицательными весами (-beta). * Добавляется цвет центрального пикселя к результату, взвешенный alpha. * Клампятся полученные значения цвета для обеспечения того, чтобы они были в диапазоне [0, 255]. * Хранятся полученные значения цвета в выходном изображении.

Посыльные условия 1. Шарпенированное изображение хранится в выходном изображении (tbm).

Советы по улучшению кода 1. Рассмотреть более эффективный способ итерации по пикселям, например, использовать цикл, который итерируется над всей картинкой, а не отдельными рядами. 2. Упростить код, уменьшив количество условных операторов и переменных. 3. Рассмотреть реализацию болееadvanced алгоритма шарпенирования, например, фильтра Лапласа или техники нечеткого маскирования (USM).

Комментарии 1. Комментарии, предоставленные в коде, помогают понимать цель каждого раздела кода, но некоторые разделы могут потребовать дополнительных объяснений или описаний переменных. 2. Рассмотреть добавление более подробных комментариев к математике алгоритма шарпенирования и его работе. 3. Некоторые имена переменных (например, re, gr, bl) не очень информативны; рассмотреть переименование их в более значимые имена.

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

Процедура шарпенинга изображения в Delphi, которая использует алгоритм шарпенинга для усиления контрастности и четкости изображения.


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

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




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


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


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-01 14:36:52/0.0035910606384277/0