ورود

View Full Version : گفتگو: پردازش تصویر در دلفی



ابوالفضل عباسی
سه شنبه 17 شهریور 1394, 17:15 عصر
با سلام خدمت دوستان برنامه نویس:لبخند:
من در تالار که جست و جو کردم درمورد پرردازش تصویر کد های خوبی بود اما هیچ کدام برای دلفی نبود بعد خودم هم برای کاری نیاز به پردازش تصویر با کمترین زمان ممکن نیاز داشتم.
حالا تا جا های خوبی پیش رفتم.
از شما دوستان سوالی دارم امیدوارم کمکم کنید تا بتوانم مشکلم را حل کنم و بقیه دوستان هم بهره ببرند.
سوال من این است که:
من 2 تا تصویر رو میخوام مقایسه کنم برای اینکه سرعت بالاتر بره اون ها رو تبدیل به سیاه و سفید میکنم.(البته با سیاه و سفید کردن بسیاری از جزئیات حذف میشه و 2 تصویر خیلی شبیه هم میشن)
برنامه ای که نوشتم به طور تقریبا دقیق 2 تصویر رو به تکه های کوچکتر مثلا 10*10 پیکسل تبدیل میکنه و با scanline کردن و با فرمان compare اون ها رو مقایسه میکنم و در حدود 900 ms طول میکشه که مقایسه درصدی نشون بده.حالا به نظر شما از چه راهی استفاده کنم تا بتونم سرعت رو بالا ببرم و زمان کاهش پیدا کنه(حدود 200 ms )؟:متفکر:

روش پیکسل به پیکسل خوبه ولی در تصویری به مقیاس 1024*726 پیکسل حدود 9800 ms طول میکشه.:اشتباه:
اگر کمکم کنید بسیار ممنون دار شما میشوم.:تشویق:

یوسف زالی
چهارشنبه 18 شهریور 1394, 10:08 صبح
سلام.
در همین تالار دلفی آقای عباسی چندین پست پردازش با همین دلفی گذاشتند، چطور گشتید و ندیدید؟
برای مقایسه دو تصویر نیازی به تکه پاره کردنش نیست. مگر اینکه بخواهید اون قسمت مورد اختلاف رو در فایل های مجزا داشته باشید.
بهترین روش مقایسه خطی افقی همون اسکن لاینه، مگر اینکه روشتون چیز دیگه باشه که باید براش یونیت مجزا بنویسید، زیاد سخت هم نیست.
یادمه در کاری این مقایسه رو انجام می دادم خیلی کم طول می کشید، تمام تصاویر رو درسته با هم مقایسه کنید و اون رو ریز ریز نکنید.

ابوالفضل عباسی
چهارشنبه 18 شهریور 1394, 12:47 عصر
ممنونم از پاسختون:تشویق:
دیدم از اون ها کمک گرفتم ولی کمک چندانی بهم نکرد.
ببخشید حاج یوسف عزیز من اگر بخوام با فرمان scanline کل عکس رو مقایسه کنم زمانش کمی کمتر از پیکسل به پیکسل میشه. من هم عکس هارو تیکه تیکه میکنم تا هم نقاط اختلاف رو نشون بدم و هم سرعت scanline بالا بره.بعد به خاطر این تصویر و سیاه و سفید میکنم چون اگر در کسری از ثانیه 2 عکس بگیرم در نور زمینه و سایه ها تفاوت رخ میده و این 2 عکس از نظر ظاهر شبیه اند ولی از نظر باطن متفاوت اند. برای اینکه مطمئن شوم که این 2 عکس پیکسل هاش فرق کرده 2 عکس رو روهم مچ میکنم می بینم خیلی فرق کرده.
حالا اگر شما روش بهتری سراغ دارید ممنون میشوم میتونم براتون پروژه ام رو بگذارم اما بهتره کمک ها تون رو اجرا کنم بعد برای اینکه همه داشته باشن پروژه رو می گذارم

BORHAN TEC
چهارشنبه 18 شهریور 1394, 19:26 عصر
با سلام،
من قبلاً در دموی کامپوننتهای imageen دیده بودم که نتیجه تفاوت دو تصویر رو به صورت درصد نشون میداد. پس میتونید برای این کار از کامپوننت های imageen هم استفاده کنید.
موفق باشید.

ابوالفضل عباسی
پنج شنبه 19 شهریور 1394, 09:23 صبح
خیلی ممنون دوست عزیز
چه طور باید از این کامپوننت استفاده کنم؟
باید با برنامه نویسی بهش دستور بدم چه طوری مقایسه کنه یا خودش اتوماتیک با یه فرمان کار میکنه؟
ببخشید سرعت مقایسه اون بالا هست؟
شما کامپوننت بدون دموش رو ندارید؟

golbafan
پنج شنبه 19 شهریور 1394, 11:56 صبح
میتونید برای مقایسه تصاویر از دستور scanline استفاده کنید
برای تصویر 800*600 حدود یک دهم ثانیه زمان میبره

procedure TForm1.Button1Click(Sender: TObject);
var
b1, b2: TBitmap;
c1, c2: PByte;
x, y, i,
different: Integer; // Counter for different pixels
begin
b1 := Image1.Picture.Bitmap;
b2 := Image2.Picture.Bitmap;
Assert(b1.PixelFormat = b2.PixelFormat); // they have to be equal
different := 0;
for y := 0 to b1.Height - 1 do
begin
c1 := b1.Scanline[y];
c2 := b2.Scanline[y];
for x := 0 to b1.Width - 1 do
for i := 0 to BytesPerPixel - 1 do // 1, to 4, dep. on pixelformat
begin
Inc(different, Integer(c1^ <> c2^));
Inc(c1);
Inc(c2);
end;
end;
end;

ابوالفضل عباسی
پنج شنبه 19 شهریور 1394, 13:56 عصر
ممنون از پاسخ شما
از این خواستم استفاده کنم اما هرچه که به جای BytesPerPixel باز هم اشتباه تشخیص میداد الان خودم یکی نوشتم که با scanline کار کنه ولی خیلی زمان می بره

Mask
شنبه 21 شهریور 1394, 00:13 صبح
ممنون از پاسخ شما
از این خواستم استفاده کنم اما هرچه که به جای BytesPerPixel باز هم اشتباه تشخیص میداد الان خودم یکی نوشتم که با scanline کار کنه ولی خیلی زمان می بره
مگه بچه ها علم غیب دارند. خوب کدتو بزار ببینیم چی نوشتی.
اینقدر تو گزاشتن کد خساست به خرج میدی ، که واسه سوال خودت هم میترسی کد بزاری.

ابوالفضل عباسی
شنبه 21 شهریور 1394, 13:13 عصر
چشم نیازی به تندگویی نیست میگذارم
برای کار با این برنامه عکس هایی که میخوان مقایسه بشن انتخاب میکنید بعد روی convert bmp to Line 2 کلیک کنید (از اولی استفاده نکنین چون مشکل داره)بعد روی compare کلیک کنید تا مقایسه کنه
در تصویر وسطی در پایین نقاطی که باهم اختلاف دارند رو سفید نشون میده و در تصویر سمت چپ پایینی نقاط دون دون نقاطی که مشابه اند رو نشون میده.
خوشحال میشم نظرتون رو درباره روش کد نویسیم بهم بدین.:لبخند:
عکس هاتون باید حتما bitmap باشه.
http://s6.picofile.com/file/8211664984/Compare_Image.zip.html

دلفــي
یک شنبه 22 شهریور 1394, 12:11 عصر
function TimeGetTime: DWord; stdcall; external 'winmm.dll' name 'timeGetTime';


function GetPixelSize(informat: TPixelFormat): Integer;
begin
case informat of
pf8bit: Result := 1;
pf16bit: Result := 2;
pf24bit: Result := 3;
pf32bit: Result := 4;
else
Result := 0;
end;
end;


function BitmapsAreSame(Bitmap1, Bitmap2: TBitmap): Boolean;
var
scanptr1, scanptr2: pointer;
i: integer;
PixelSize: byte;
begin
Result := false;
if (Bitmap1.Width = Bitmap2.Width) and
(Bitmap1.Height = Bitmap2.Height) and
(Bitmap1.PixelFormat = Bitmap2.PixelFormat) then
begin
PixelSize := GetPixelSize(Bitmap1.PixelFormat);
for i := 0 to (Bitmap1.Height-1) do
begin
scanptr1 := Bitmap1.ScanLine[i];
scanptr2 := Bitmap2.ScanLine[i];
Result := CompareMem(scanptr1, scanptr2, Bitmap1.Width*PixelSize);
if Result = false then break;
end;
end;
end;


procedure TForm1.BitBtn1Click(Sender: TObject);
TF:Boolean;
begin
TF := BitmapsAreSame(Image1.Picture.Bitmap, Image2.Picture.Bitmap);
end;

R0b3rtx99
یک شنبه 22 شهریور 1394, 12:30 عصر
سلام

این نمونه آخر اصلا برای محاسبه زمان اجرا روش دقیقی نیست و باید از توابع high resolution استفاده کنید!!!

و اما شما دوست عزیز که میخوای پردازش تصویر کار کنید. بیخیال دلفی شده زبان C++ رو انتخاب کنید و هم از سرعت به مراتب بهترش در این زمینه لذت ببرید و هم کتابخونه های مثل opencv.

روز خوش

ابوالفضل عباسی
یک شنبه 22 شهریور 1394, 12:37 عصر
با سلام
تشکر از پاسختون
ولی یکی مثل من که با دلفی سالیان سال کار کرده سخته بره C++‎‎‎ یادبگیره.
بعدش هم الان سرعت برنامه خیلی بالا هست و به 2 ثانیه هم کشیده نمی شود.این زمان برای من خوبه ولی چون کاری که دارم به صدم ثانیه مربوط هست میخواستم سرعتش بالاتر بره.
امیدوارم با دوستانی که هستند بتونم مشکلم رو حل کنم و هم من فیض ببرم و هم شما دوستان از این برنامه فیض ببرید

دوست عزیز اقای دلفی کدی که فرستادید عالی بود و خوشم اومد تنها یک عیب برای من داشت(شاید برای دیگران نداشته باشد)من عکس ها رو تکه تکه میکنم تا از نظر درصدی نشون بدم چقدر شبیه هم هستند. ولی این در بعضی از مواقع درست نشون میداد و بعضی مواقع اشتباه:اشتباه:
بعد هم وقتی تکه تکه میکنم کد شما با کد من از نظر زمانی یکسان می شوند.(ببخشیدا تازه کد خودم از نظر زمانی بهتر عمل میکند).
ولی از توجهی که به سوالم کرده اید ممنونم

دلفــي
دوشنبه 23 شهریور 1394, 08:46 صبح
135213

لينك دانلود (http://s6.picofile.com/file/8212013668/Compare.rar.html)

ابوالفضل عباسی
دوشنبه 23 شهریور 1394, 12:51 عصر
اگر این برنامه رو شما نوشته اید بسیار بسیار عالی هستش
میتونید بگویید با چه روشی عکس ها رو مقایسه میکند(یا حتی کدش رو بدهید)؟
ولی تنها یک مشکل دارد در تصاویر که خیلی با هم فرق وجود دارد درصدی که نشان میدهد خیلی بالاهستش(اما از نظر زمانی ایده آل هستش)
اگر میشود کدش رو برای من و دوستان قرار دهید و یا به این ایمیل بفرستید
programmer9001@gmail.com

R0b3rtx99
پنج شنبه 26 شهریور 1394, 08:34 صبح
اگر این برنامه رو شما نوشته اید بسیار بسیار عالی هستش
میتونید بگویید با چه روشی عکس ها رو مقایسه میکند(یا حتی کدش رو بدهید)؟
ولی تنها یک مشکل دارد در تصاویر که خیلی با هم فرق وجود دارد درصدی که نشان میدهد خیلی بالاهستش(اما از نظر زمانی ایده آل هستش)
اگر میشود کدش رو برای من و دوستان قرار دهید و یا به این ایمیل بفرستید
programmer9001@gmail.com
دوستمون از کامپوننت ImageEn استفاده کرده، سرچ کن شاید sample هم داشته باشه!

دلفــي
پنج شنبه 26 شهریور 1394, 09:48 صبح
اگر این برنامه رو شما نوشته اید بسیار بسیار عالی هستش
میتونید بگویید با چه روشی عکس ها رو مقایسه میکند(یا حتی کدش رو بدهید)؟
ولی تنها یک مشکل دارد در تصاویر که خیلی با هم فرق وجود دارد درصدی که نشان میدهد خیلی بالاهستش(اما از نظر زمانی ایده آل هستش)
اگر میشود کدش رو برای من و دوستان قرار دهید و یا به این ایمیل بفرستید
programmer9001@gmail.com


از کامپوننت ImageEn كمك بگيريد

khorsandreza
چهارشنبه 29 دی 1395, 17:03 عصر
135213

لينك دانلود (http://s6.picofile.com/file/8212013668/Compare.rar.html)

سلام بر دوستان هرجند اززمان این تاپیک خیلی گذشته ولی چون سوالم در این رابطه بود دوباره فعال کردم من روش مقایسه EmagEn را دیدم و ازان بسورت تستی استفاده کردم ولی من می خواهم مقایسه را در سطح اطلاعات بیشتر بررسی کنم من تفداد زیادی عکس دارم (حدود 250 هزار فقطعه) که با استفاده از File Table مدیریت می کنم و کارهایم را انجام میدهم . داخل این عکس ها تکراری است حال می خواهم وقتی کاربر تصویری را انتخاب کرد سیستم کل تصاویر ذخیره شده قبل را بررسی کنه بگه قبلا از این تصویر در سیستم ثبت شده .