لمحة عن التعامل مع الصور
#1
في البداية السلام عليكم


بالمرفقات تطبيق به بعض الدوال و الأكواد لمن يريد أخذ فكرة أولية على
Digital Image Processing

لمحة:
إقتباس :تعتبر الصورة مجموهة من Pixels
و كل Pixel تأخذ قيمة بين 0 و 255
أي بين اللون الأبيض و صولا الى الأسود
المجال بين القيمتين يمثل مجوعة الألوان الأخرى بمختلف أشكالها

نأتي الان الى الصور من ناحية النوعية
حيث هناك عدة أنواع من الصور منها BitMap Images
وهي التي يستعملها الجميع في الحياة اليومية
(الموجود في الهاتف الجوال و الجرائد و المصورة و التي بجهاز الحاسوب)
لكن منها ما هو ثنائي الأبعاد و منها ما هو ثلاثي الأبعاد

بصفة عامة من ناحية الألوان الصورة يمكن أن تكون:
تحمل لونين فقط أي أبيض أو أسود
تحمل مجموعة من الألوان و تكون الألوان في المجال الذي ذكرته سابقا أي بين 0 و 255

بالنسبة الى الصور بالألوان يتم دراستها مقارنة بثلاثة ألوان وهم
الأحمر Red
الأخضر Green
الأزرق Blue
و ذلك نظرا لكون كل لون هو خليط من لونين فأكثر و هذه الألون هي مصدر كل شيء
و لكون العين تحتاجها لتمييز بعض الأشياء منها الطبيعة أي اللون الأخضر
السماء اللون الأزرق و أشعة الشمس اللون الأحمر



[صورة: dipimg01.png]

{Function To Take a ScreenShot Of The Desktop}
أخذ صورة لسطح المكتب

كود :
function GetScreenShot: TBitmap;
var
  Desktop: HDC;
begin
  Result  := TBitmap.Create;
  Desktop := GetDC(0);
  try
    try
      Result.PixelFormat := pf32bit;
      Result.Width := Screen.Width;
      Result.Height := Screen.Height;
      BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height, Desktop, 0, 0, SRCCOPY);
      Result.Modified := True;
    finally
      ReleaseDC(0, Desktop);
    end;
  except
    Result.Free;
    Result := nil;
  end;
end;

عملية الاستدعاء كالاتي:
كود :
procedure TForm1.ScrShotBtnClick(Sender: TObject);
begin
  Image1.Picture.Bitmap:= GetScreenShot;
end;

{Procedure To Take a ScreenShot Of An Active Window}
أخذ صورة للنافذة الحية في سطح المكتب

كود :
procedure ScreenShotActiveWindow(Bild: TBitMap; Val: Boolean);
var
  c: TCanvas;
  r, t: TRect;
  h: THandle;
begin
    c := TCanvas.Create;
    c.Handle := GetWindowDC(GetDesktopWindow);
    h := GetForeGroundWindow;
    if h <> 0 then
      GetWindowRect(h, t);
    try
      r := Rect(0, 0, t.Right - t.Left, t.Bottom - t.Top);
      Bild.Width  := t.Right - t.Left;
      Bild.Height := t.Bottom - t.Top;
      Bild.Canvas.CopyRect(r, c, t);
    finally
      ReleaseDC(0, c.Handle);
      c.Free;
    end;
end;

عملية الاستدعاء كالاتي:
كود :
procedure TForm1.WinCapBtnClick(Sender: TObject);
begin
  ScreenShotActiveWindow(Image1.Picture.BitMap, Ok);
end;

{ ***** Image without Blue Color ***** }
الحصول على صورة بدون الاعتماد على اللون الأزرق

كود :
procedure TForm1.ImgWBBtnClick(Sender: TObject);
var
  Z,X,bX,Y : Integer;
  Ligne : PByteArray;
begin
  for Z := 0 to  Form1.Image1.Picture.Bitmap.Width - 1  do begin
    for Y := 0 to Form1.Image1.Picture.Bitmap.Height - 1 do begin
      Ligne := Image1.Picture.Bitmap.ScanLine[Y];
      for X := 0 to Form1.Image1.Picture.Bitmap.Width -1 do begin
        bX := X * 3;
        Ligne[bX] := (Ligne[bX+3]);
      end;
    end;
    Form1.Image1.Repaint;
  end;
end;

{ ***** Image without Green Color ***** }
الحصول على صورة بدون الاعتماد على اللون الأخضر

كود :
procedure TForm1.ImgWGBtnClick(Sender: TObject);
var
  Z,X,bX,Y : Integer;
  Ligne : PByteArray;
begin
  for Z := 0 to  Form1.Image1.Picture.Bitmap.Width - 1  do begin
    for Y := 0 to Form1.Image1.Picture.Bitmap.Height - 1 do begin
      Ligne := Image1.Picture.Bitmap.ScanLine[Y];
      for X := 1 to Form1.Image1.Picture.Bitmap.Width do begin
        bX := X * 3;
        if X = Form1.Image1.Picture.Bitmap.Width then
          Ligne[bX-2] := 0
        else
          Ligne[bX-2] := (Ligne[bX+1]);
      end;
    end;
    Form1.Image1.Repaint;
  end;
end;

{ ***** Image without Red Color ***** }
الحصول على صورة بدون الاعتماد على اللون الأحمر

كود :
procedure TForm1.ImgWRBtnClick(Sender: TObject);
var
  X,Y, bX : Integer;
  Ligne : PByteArray;
begin
  for Y := 0 to Form1.Image1.Picture.Bitmap.Height -1 do begin
    Ligne := Form1.Image1.Picture.Bitmap.ScanLine[Y];
    for X := 0 to Form1.Image1.Picture.Bitmap.Width -1 do begin
       bX := X * 3;
       Ligne[bX+2] := 0;
    end;
    Form1.Image1.Repaint;
  end;
end
;

{ ***** Obtain Flow Image ***** }
الحصول على صورة مشوشة

كود :
procedure TForm1.ImgFlowBtnClick(Sender: TObject);
var
  Z,X,bX,Y : Integer;
  Ligne : PByteArray;
begin
for Z := 0 to 3 do Begin
  for Y := 0 to Form1.Image1.Picture.Bitmap.Height -1 do begin
    Ligne := Image1.Picture.Bitmap.ScanLine[Y];
    for X := 1 to Form1.Image1.Picture.Bitmap.Width -1 do Begin
       bX := X * 3;
       Ligne[bX+2] := (Ligne[bX+2]+Ligne[bX-1] ) Div 2;
       Ligne[bX+1] := (Ligne[bX+1]+Ligne[bX-2]) Div 2;
       Ligne[bX] := (Ligne[bX]+Ligne[bX-3]) Div 2;
    end;
  end;
  Form1.Image1.Repaint;
end;
end;

[صورة: dipimg02.png]

[صورة: dipimg03.png]

لمن يريد التعامل مع الصور يستحن أن يستعمل صور بصيغة *.bmp
تم ارفاق صورة لمن يريد التجربة مع الملفات

بالتوفيق للجميع
و السلام.


الملفات المرفقة
.rar   DiP Src.rar (الحجم : 5.97 ك ب / التحميلات : 404)
.rar   DiP Exe.rar (الحجم : 497.38 ك ب / التحميلات : 706)
[-] كل من 2 users say قال شكرا ل MjIrIm على المشاركة المفيدة
  • Delphi_2007, sathex
الرد
#2
بارك الله فيك MjIrIm جميل جدا .
لو إستعنت بصورة قوس قزح لأخذ قيم اللون بمجرد مرور المؤشر عليه
لتضيفه كخيار لفلترة الصورة .. مجرد فكرة .
بالتوفيق ,,
الرد


التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم