Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Медианный фильтр


Автор: Barabeo 25.11.2010, 13:16
Вот код моего фильтра:
Код

unit Median;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtDlgs, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    Button2: TButton;
    OpenPictureDialog1: TOpenPictureDialog;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  iw,ih: integer; // первоначальный размер компонента Image
implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  if OpenPictureDialog1.Execute then
     Image1.Picture.LoadFromFile(OpenPictureDialog1.FileName);
end;

procedure Scalelmage;
var

pw, ph : integer; // размер иллюстрации
scaleX, scaleY : real; // масштаб по Х и Y
scale : real; // общий масштаб

begin
// иллюстрация уже загружена
// получим ее размеры

pw := Form1.Image1.Picture.Width;
ph := Form1.Image1.Picture.Height;

if pw > iw // ширина иллюстрации больше ширины компонента Image
then scaleX := iw/pw // нужно масштабировать
else scaleX := 1;
if ph > ih // высота иллюстрации больше высоты компонента
then scaleY := ih/ph // нужно масштабировать
else scaleY := 1;

// выберем наименьший коэффициент 
if scaleX < scaleY
then scale := scaleX
else scale := scaleY;

// изменим размер области вывода иллюстрации
Form1.Image1.Height := Round(Form1.Image1.Picture.Height*scale);
Form1.Image1.Width := Round(Form1.Image1.Picture.Width*scale);

// т. к. Strech = True и размер области пропорционален
// размеру картинки, то картинка масштабируется без искажений

end;
procedure TForm1.Button2Click(Sender: TObject);
 var
 PixelArray:array of Byte;
 Value:Byte;
 CurrentLine:pByteArray;
 BoxCurrentLine:pByteArray;
 Vert,Hor:Integer;
 VertB,HorB:Integer;
 Counter:Integer;
 Temp:Byte;
begin
 ValueForm.Caption := 'Размер окна фильтра n X n';
 ValueForm.TrackBar1.Min := 3;
 ValueForm.TrackBar1.Max := 9;
 ValueForm.TrackBar1.Frequency := 2;
 if ValueForm.Execute(Value) then
 begin
  SetLength(PixelArray,Value*Value);

  if Image1.Picture.Bitmap.PixelFormat = pf8bit then
  begin
   for Vert := 0 to Image1.Picture.Bitmap.Height - 1 do
   begin
    CurrentLine := Image1.Picture.Bitmap.ScanLine[Vert];

    for Hor := 0 to Image1.Picture.Bitmap.Width - 1 do
    begin

     // Заносим все пиксели окошка в массив
     Counter := 0;
     for VertB := (Vert - (Value div 2)) to (Vert + (Value div 2)) do
     begin
      if (VertB >= 0) and (VertB < Image1.Picture.Bitmap.Height) then
       BoxCurrentLine := Image1.Picture.Bitmap.ScanLine[VertB];

      for HorB := (Hor - (Value div 2)) to (Hor + (Value div 2)) do
      begin

       if (HorB >= 0) and (VertB >= 0) and
          (HorB < Image1.Picture.Bitmap.Width) and
          (VertB < Image1.Picture.Bitmap.Height) then
        PixelArray[Counter] := BoxCurrentLine^[HorB]
       else
        PixelArray[Counter] := 0;

       Inc(Counter);
      end;
     end;

     // Сортируем массив
     for VertB := 0 to Value*Value - 1 do
     begin
      for HorB := VertB to Value*Value - 1 do
      begin
       if PixelArray[VertB] > PixelArray[HorB] then
       begin
        Temp := PixelArray[VertB];
        PixelArray[VertB] := PixelArray[HorB];
        PixelArray[HorB] := Temp;
       end;
      end;
     end;

     // Берем то что посередине и присваиваем текущему пикселю
     CurrentLine^[Hor] := PixelArray[((Value*Value) div 2) + 1];
    end;

   end;

   Image1.Visible := False;
   Image1.Visible := True;
  end
  else
   MessageBox(Handle,'Такой формат файла пока не подерживается',
                     'Message',MB_OK or MB_ICONSTOP or  MB_APPLMODAL);
 end;
end;


end.


При компиляции один варнинг, на счёт инициализации переменной BoxCurrentLine.А так всё работает.Но вот результат мне чё-то не нравится.Какой-то слишком уж мощно он фильтрует.

Вылил RAR, там исходник с EXE и pictures.Гляньте кто-нибудь.

Автор: Barabeo 26.11.2010, 12:53
Народ,чё никто не шпрехает?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)