Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];

Вниз

сглаживание, выделение границ и т.д и т.п.   Найти похожие ветки 

 
анонимус   (2011-08-23 06:04) [0]

Вообщем пытаюсь как нибудь изувечить изображение, чтобы при его последующей (ну или одновременной) бинаризации "пропадало" как можно меньше "нужных" пикселей. отчего пытаюсь делать всяческие фильтры. Но читая то как они "работают". и смотря на то что получается у меня ко мне вкрадываются некоторые сомнения, да и вообще весьма смутно себе представляю как эти формулы преобразовать в код. Вообщем может ли кто нибудь привести реально работающий пример, желательно размытия гаусса ? )

привожу пример одного из фильтров который пытался делать я, может кто нить скажет в чем я не прав? )

Задача:
Метод Собела работает с двумерной апертурой 3х3 следующего вида: A1 A2 A3
A8 F A4
A7 A6 A5
   X = ( A3 + 2 * A4 + A5 ) – ( A1 + 2 * A8 + A7 )

   Y = ( A1 + 2 * A2 + A3 ) – ( A7 + 2 * A6 + A5 )

Сначала находятся значения переменных X и Y по приведённым выше формулам. После находится новое значение центрального элемента:

Далее то как я это закодил )

procedure MethodSobelaFilter(tBmp: TBitmap);
var
  QP: TQuickPixels;
  Pixel1: Cardinal;
  r1: byte;
  g1: byte;
  b1: byte;
  Intensity:integer;
  X1:integer;
  X2:integer;
  Y1:integer;
  Y2:integer;
  x:integer;
  y:integer;

//   j:integer;
//   i:integer;
  jmin:integer;
  imin:integer;
  jmax:integer;
  imax:integer;
  A1:integer;
  A2:integer;
  A3:integer;
  A4:integer;
  A5:integer;
  A6:integer;
  A7:integer;
  A8:integer;
  appsize:byte;

begin

       QP := TQuickPixels.Create;
       QP.Attach(tBmp);

        appsize:=3;
        for y := 0 to QP.Height-1 do
        begin
         for x := 0 to QP.Width-1 do
           begin

             //Определим границы апертуры, чтобы не вылететь за границы изображения++
             jmax:= y+trunc(appsize/2);
             jmin:= y-trunc(appsize/2);
             imax:= x+trunc(appsize/2);
             imin:= x-trunc(appsize/2);

             if jmax>(QP.Height-1) then jmax:= (QP.Height-1);
             if jmin<0 then jmin:=0;
             if imax>(QP.Width-1) then imax:=(QP.Width-1);
             if imin<0 then imin:=0;
             //Определим границы апертуры, чтобы не вылететь за границы изображения--

             Pixel1 := QP.GetPixels24(imax,jmin);
             r1 := (Pixel1 and $000000FF);
             g1 := (Pixel1  and $0000FF00) shr 8;
             b1 := (Pixel1 and $00FF0000)  shr 16;
             A3  := integer(77*r1 + 150*g1 + 29*b1) SHR 8;

             Pixel1 := QP.GetPixels24(imax,jmax-1);
             r1 := (Pixel1 and $000000FF);
             g1 := (Pixel1  and $0000FF00) shr 8;
             b1 := (Pixel1 and $00FF0000)  shr 16;
             A4  := integer(77*r1 + 150*g1 + 29*b1) SHR 8;

             Pixel1 := QP.GetPixels24(imax,jmax);
             r1 := (Pixel1 and $000000FF);
             g1 := (Pixel1  and $0000FF00) shr 8;
             b1 := (Pixel1 and $00FF0000)  shr 16;
             A5  := integer(77*r1 + 150*g1 + 29*b1) SHR 8;

             Pixel1 := QP.GetPixels24(imin,jmin);
             r1 := (Pixel1 and $000000FF);
             g1 := (Pixel1  and $0000FF00) shr 8;
             b1 := (Pixel1 and $00FF0000)  shr 16;
             A1 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;

             Pixel1 := QP.GetPixels24(imin,jmax-1);
             r1 := (Pixel1 and $000000FF);
             g1 := (Pixel1  and $0000FF00) shr 8;
             b1 := (Pixel1 and $00FF0000)  shr 16;
             A8 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;

             Pixel1 := QP.GetPixels24(imin,jmax);
             r1 := (Pixel1 and $000000FF);
             g1 := (Pixel1  and $0000FF00) shr 8;
             b1 := (Pixel1 and $00FF0000)  shr 16;
             A7 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;

             Pixel1 := QP.GetPixels24(imax-1,jmin);
             r1 := (Pixel1 and $000000FF);
             g1 := (Pixel1  and $0000FF00) shr 8;
             b1 := (Pixel1 and $00FF0000)  shr 16;
             A2 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;

             Pixel1 := QP.GetPixels24(imax-1,jmax);
             r1 := (Pixel1 and $000000FF);
             g1 := (Pixel1  and $0000FF00) shr 8;
             b1 := (Pixel1 and $00FF0000)  shr 16;
             A6 := integer(77*r1 + 150*g1 + 29*b1) SHR 8;

             X1:= ( A3 + 2 * A4 + A5 );
             X2:= ( A1 + 2 * A8 + A7 );
             X1:= X1-X2;
             Y1:= ( A1 + 2 * A2 + A3 );
             Y2:= ( A7 + 2 * A6 + A5 );
             Y1:= Y1-Y2;

             Intensity:= Round(sqrt(sqr(X1)+sqr(Y1)));

             IF   Intensity < 0
             THEN Intensity := 0
             ELSE
             IF   Intensity > 255
             THEN Intensity := 255;

             QP.SetPixels24(X, Y, RGB(Intensity,Intensity,Intensity));

           end;
        end;

        tBmp.SavetoFile("E:\test.bmp");
        qp.Free;

end;



а енто результат: http://s55.radikal.ru/i150/1108/a5/2aae0f94745b.bmp,

Если руками отнять от яркости этак 200 то точек становится на экране больше, но исходного изображения там не разглядеть все равно )


 
анонимус   (2011-08-23 06:10) [1]

а задаче Формула потерялась. " После находится новое значение центрального элемента:"

Вообщем  центральный элемент матрицы F = sqrt(sqr(X)+ sqr(Y)). Вычисляется как квадратный корень из суммы квадратов Х и Y.


 
han_malign   (2011-08-23 12:59) [2]


> QP.GetPixels24
 .....
> QP.SetPixels24

- а кто тебе сказал, что это фильтр рекуррентный?


 
Sha ©   (2011-08-23 13:11) [3]

> анонимус
> может кто нить скажет в чем я не прав?

меняешь входное изображения в процессе построения выходного


 
анонимус   (2011-08-23 17:43) [4]

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

Пока лучшим из испробованных методов остается приведение в 2х цветный вид по средней яркости. В шрифтах он сохраняет наибольшее количество информации. Но практика показывает что средней яркости многовато, а если просто сохранить бмп в монохромный формат, то пропадает слишком много пикселей и некоторые слова становятся нечитаемыми вообще даже мной ) хотя для большей части картинки результат лучше чем по средней.

Может у кого есть идеи?


 
Sha ©   (2011-08-23 19:35) [5]

На большом белом заборе черной краской мелко написано одно слово.
На большом сером заборе черной краской мелко написано одно слово.
На большом белом заборе серой краской мелко написано одно слово.

Есть идеи?


 
Anatoly Podgoretsky ©   (2011-08-23 19:57) [6]

> Sha  (23.08.2011 19:35:05)  [5]

Есть, только за них бан


 
анонимус   (2011-08-23 20:16) [7]


> На большом белом заборе черной краской мелко написано одно
> слово.
> На большом сером заборе черной краской мелко написано одно
> слово.
> На большом белом заборе серой краской мелко написано одно
> слово.
>
> Есть идеи?


> > QP.GetPixels24
>  .....
> > QP.SetPixels24
>
> - а кто тебе сказал, что это фильтр рекуррентный?
> <Цитата>


Господа, я конечно понимаю, что вы думаете, что вы пытаетесь объяснить что то очень важное, но на самом деле это не так.


 
Sha ©   (2011-08-23 20:45) [8]

Перестал думать



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2011.12.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
2-1314338415
Gevs
2011-08-26 10:00
2011.12.11
Мышь


15-1313526604
Юрий
2011-08-17 00:30
2011.12.11
С днем рождения ! 17 августа 2011 среда


15-1314217798
Юрий
2011-08-25 00:29
2011.12.11
С днем рождения ! 25 августа 2011 четверг


4-1252106846
demon
2009-09-05 03:27
2011.12.11
Как обработать нажатие на кнопку минимизации?


15-1313841147
Leon-Z
2011-08-20 15:52
2011.12.11
Каретка Windows.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский