Модераторы: Snowy, MetalFan, bems, Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Медианный фильтр, кто шарит в графике? 
:(
    Опции темы
Barabeo
Дата 25.11.2010, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Вот код моего фильтра:
Код

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.Гляньте кто-нибудь.

Присоединённый файл ( Кол-во скачиваний: 56 )
Присоединённый файл  _____.rar 201,42 Kb
PM MAIL   Вверх
Barabeo
Дата 26.11.2010, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Народ,чё никто не шпрехает?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0422 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.