PDA

View Full Version : چگونگی مقایسه پیکسل به پیکسل تصویر در سی شارپ



hemati
دوشنبه 13 آذر 1385, 13:00 عصر
چگونه می توان تصویری را با تصویر دیگر در #C مقایسه نمود که تصویر اولی با تصویر دوم یکسان است . و اگر اختلاف داشت چند درصد با هم متفاوتند (بحث پردازش تصویر درC#.net)

PC2st
سه شنبه 14 آذر 1385, 21:46 عصر
کسی بلد بود بگه که برای من هم سواله!
حدس میزنم که باید یه متدی مثل GetPixel باشه. خواستم این متد رو به PictureBox ربط بدم، که بلد نبودم.

Seyedalavifar
شنبه 18 آذر 1385, 14:18 عصر
اگر بخواهیم دو عکس را با هم مقایسه کنیم کافی است آن دو را در دو متغیر بایت بریزیم و بایت به بایت به بررسی آنها بپردازیم مانند :
strImgName = openFileDialog.FileName
ByteOfFile = System.IO.File.ReadAllBytes(strImgName

که در آن byteoffile یک متغییر بایتی است :
byte[] ByteOfFile
حال شما 2 تا از این متغییر تعریف کنید و ...

PC2st
شنبه 18 آذر 1385, 18:40 عصر
مقایسه بایت به بایت مطلقا یکی از مقایسه های اساسی و خوب به حساب میآد، اگر بخوایم بدونیم که دو تا عکس چند درصد با هم اختلاف دارن میشه از مقایسه بایت به بایت استفاده کرد ولی کمی مشکله که از بایتها سر در بیآریم و نیاز به کار Professional داره و ساده تر هست که مقایسه پیکسل به پیکسل داشته باشیم برای وقتی که میخوایم بدونیم دو تا عکس چند درصد با هم اختلاف دارن. میشه از کلاس Bitmap برای اینکار استفاده کرد:



Bitmap b1 = newBitmap("FileName1");
Bitmap b2 = newBitmap("FileName2");
if(b1.GetPixel(0, 0) == b2.GetPixel(0, 0))
MessageBox.Show("The First Pixel is Similar");



که FileName1 آدرس عکس اول و FileName2 آدرس عکس دوم است و در صورتی که پیکسل 0و0 از عکس اول با پیکسل 0و0 از عکس دوم برابر باشه، متن The First Pixel is Similar به نمایش در میآد.

البته میتونی از کدهائی هم استفاده کنی و مقدار رنگ قرمز یا سبز یا آبیشون رو در پیکسل 0و0 مورد مقایسه قرار بدی مثلا برای اینکه بدونی در پیکسل 0و0، رنگ قرمز عکس اول کمتر هست یا نه، بصورت زیر مینویسیم:



if(b1.GetPixel(0, 0).R < b2.GetPixel(0, 0).R)
MessageBox.Show("The Red Color is Smaller");



در فوق در صورتی که مقدار رنگ قرمز از پیکسل 0و0 عکس اول کمتر از مقدار رنگ قرمز از پیکسل 0و0 عکس دوم باشه، متن The Red Color is Smaller به نمایش در میآد.
البته برای رنگهای آبی از B و سبز از G استفاده میکنیم.


در آخر اگر بخوای کل پیکسلهای عکس رو تک تک با هم مقایسه کنی باید از یک حلقه for استفاده کنی و پیکسلهای متناظر رو با هم مقایسه کنی (چه از لحاظ برابر بودن یا چه از لحاظ مقدار رنگ قرمز یا آبی یا ...) تا مقایسه فایلها به اتمام برسه (باید دو متغیر i و j برای حلقه for استفاده بشه تا پیکسلهای iوj از هر دو عکس، با هم مقایسه بشن) سپس با توجه به مقایسه*ها میشه فهمید که دو عکس چند درصد با هم اختلاف دارند.


البته برای این مقایسه از کلاس Bitmap استفاده شد، و نمیدونستم میشه از کنترل PictureBox برای این منظور استفاده کرد یا نه...

Hossein Bazyan
شنبه 18 آذر 1385, 20:52 عصر
با این توضیحاتی که شما گفتید یک سوال پیش میاد آنهم اینکه برای مقایسه یک فایل با حجم مثلا 200 کیلو بایت چقدر زمان نیاز است ؟
منظورم مقایسه همه رنگها است .

Behrooz_CS
یک شنبه 19 آذر 1385, 09:50 صبح
مقایسات باید پیکسل به پیکسل انجام بشه ، راه دیگه ای هم نداره
می توان دو عکس هم سایز را پیکسل به پیکسل مقایسه کرد و گفت که چقدر با هم تفاوت دارن ( به در صد ) کار راحتیه :D

someCoder
یک شنبه 19 آذر 1385, 11:27 صبح
مقایسه بایت به بایت مطلقا یکی از مقایسه های اساسی و خوب به حساب میآد

مقایسات باید پیکسل به پیکسل انجام بشه ، راه دیگه ای هم ندارهمیشه منبعتونم ذکر کنید و بگید از روی چه کتابی، مقاله ای یا ... اینو گفتین؟
ظاهرا کلا بحث پردازش تصویر رو شما خلاصه کردین در یه جمله!

PC2st
یک شنبه 19 آذر 1385, 16:09 عصر
با این توضیحاتی که شما گفتید یک سوال پیش میاد آنهم اینکه برای مقایسه یک فایل با حجم مثلا 200 کیلو بایت چقدر زمان نیاز است ؟
منظورم مقایسه همه رنگها است .

فکر کنم زمان زیادی صرف بشه :)

اگه بخوایم سرعت رو بالاتر ببریم، میشه بجای استفاده از خاصیتهای R (مقدار رنگ قرمز) یا G (سبز) یا B (آبی) از یک متد برای مقایسه استفاده کرد و اون متد ToArgb() هست، این متد مقدار رنگ رو بصورت یک عدد از نوع int برمیگردونه، (منتهی این متد، مقدار رنگ را بصورت کلی مشخص میکند، یعنی به راحتی نمیشه فهمید که رنگ قرمزش چقدره یا آبیش چقدره، اگر هم بشه من بلد نیستم. متد ToArgb() فقط یک کد میده که ترکیبی از رنگهای قرمز و آبی و ... است) و کافیه که، این اعداد رو برای هر پیکسل از هر دو عکس، با هم مقایسه کنیم و هرچه فاصله این اعداد از هم بیشتر باشه، مسلما تفاوت در مقدار رنگ اون پیکسل هم بیشتره. یعنی با کمک این خاصیت، بجای مورد شرط قرار گرفتن سه خاصیت R و G و B از یک متد ToArgb() استفاده میکنیم. سرعت بیشتر میشه. به کمک این متد 6 ثانیه طول میکشه که دو فایل 200 کیلوبایتی رو مقایسه کنی.

البته، مطمئنا روش سریعتری هم وجود خواهد داشت. مثلا روشی که از طریق Pointer به پیکسلهای یک Bitmap که در آرایه ذخیره شده باشه، دسترسی داشته باشیم که مطمئنا سریعتر هست. در آدرس زیر یک کلاس نوشته شده که به کمک اون کلاس میتونید از طریق Pointer به آرایه‌ای از پیکسلهای یک Bitmap دسترسی داشته باشید و خودش یک GetPixel جدید توش معرفی کرده که مقدار پیکسل با سرعت بیشتری با همین تکنیک، بدست خواهد آمد، ولی خودم هنوز اون رو امتحان نکردم:

http://www.dreamincode.net/forums/index.php?showtopic=14788&st=0&p=144886&#entry144886

PC2st
دوشنبه 20 آذر 1385, 17:18 عصر
میشه منبعتونم ذکر کنید و بگید از روی چه کتابی، مقاله ای یا ... اینو گفتین؟
ظاهرا کلا بحث پردازش تصویر رو شما خلاصه کردین در یه جمله!


مقایسه بایت به بایت مطلقا یکی از مقایسه های اساسی و خوب به حساب میآد

بله، شما درست میگوئید، من در استفاده از این جمله، بیش از حد عجله کردم.

مشخصات هر پیکسل در هر عکس، در چندین بایت میتواند ذخیره شود (در حالی که من گفته بودم بایت به بایت و بهتر بود میگفتم بایتها با بایتها آنهم نه بایتهائی که حتما متناظر باشند) و از اینکه گفتم اساسی هست، بخاطر این بود که اساس کار خواندن فایلها، این است که فایل را چه بصورت باینری چه متنی (چه بایت بایت یا خط خط یا بیت بیت!!!) خوانده و سپس مقایسه ها را از بین اطلاعات خوانده شده، انجام دهیم.

ولی متاسفانه این جمله ای که بکار بردم (بخصوص کلمه مطلقا)، اصلا جالب نبود ...
بلکه بهتر بود تا این حد عجله نمیکردم، منظور خودم رو بیشتر توضیح میدادم و در یک خط خلاصه نمیکردم.

ARA
سه شنبه 21 آذر 1385, 09:47 صبح
اما پردازش تصویر چیزی خیلی فراتر از این چیز هاست

Milad.a.p
پنج شنبه 23 آذر 1385, 16:09 عصر
یکی از شاخه های هوش مصنوعی است !!! بایت و پیکسل و ... هم نمیشناسد.

amirsadeghi
جمعه 15 دی 1385, 21:39 عصر
من فکر میکنم با استفاده از بایت هم سرعت و هم دقت افزایش پیدا کنه

Amir Oveisi
یک شنبه 17 دی 1385, 16:49 عصر
www-hto.usc.edu/papers/msw_papers/msw-062.pdf

amirsadeghi
سه شنبه 19 دی 1385, 00:31 صبح
ممنون راهنمایی خوبی بود
پیشنهاد می کنم دانلود کنید

siya_kh1983
جمعه 25 خرداد 1386, 20:15 عصر
سلام. من دارم روی یک پروژه پردازش تصویر کار می کنم که فیلمی را می گیرد و مسیر اجسام متحرک رو تشخیص می ده. من می خواستم frame هایی که دارم رو به grayScale تبدیل کنم. در حالت safe این کار خیلی پردازش میگیره. توی MSDN یک کد هست که حالت unsafe هست و خیلی قشنگه. پیشنهاد می کنم که اون کد رو ببینید. اون کد عکس رنگی رو با سه الگریتم به grayScale تبدیل می کنه

alirezavafi
شنبه 26 خرداد 1386, 17:11 عصر
اگه فقط یکی بودن عکسا مهمه میشه از hash code استفاده کرد.
بدین ترتیب که Hash code دو تا عکس رو حساب می کنیم و اگه مساوی بودند دو عکس یکی هستند. (hash code بر اساس بایتهای فایل بدست می آیند و مانند اثر انگشت هستند)

alirezavafi
شنبه 26 خرداد 1386, 17:36 عصر
اگه فقط یکی بودن عکسا مهمه میشه از hash code استفاده کرد.
بدین ترتیب که Hash code دو تا عکس رو حساب می کنیم و اگه مساوی بودند دو عکس یکی هستند. (hash code بر اساس بایتهای فایل بدست می آیند و مانند اثر انگشت هستند)

reza.palang
شنبه 26 خرداد 1386, 17:49 عصر
این راه ها هیچ کدوم عملی نیست. این یه مبحث توی هوش مصنوعی هست که به این راحتی ها و با یه برنامه کوچیک و با یه تاپیک درست بشو نیست. کتاب digital image processing دارم که 800 صفحه هست.
من خودم دارم میخونمش. اگه به این موضوع علاقه مندین پیشنهد من اینه که بخونیدش
ظاهرا این تاپیک در زمان خودش هم نتیجه ای نداشته.

alirezavafi
شنبه 26 خرداد 1386, 18:20 عصر
hash code کاربرد گسترده ای دارد.
از مهمترین کاربردهای آن این است که سیستم های اینترنتی جای ذخیره پسورد در دیتابیس hash code پسورد رو ذخیره می کنن و زمانی که کاربر می خواهد وارد شود hash پسورد ورودی رو با hash که در دیتابیس ذخیره شده چک می شه و اگه یکی بود یعنی پسورد درسته

reza.palang
شنبه 26 خرداد 1386, 19:02 عصر
hash code کاربرد گسترده ای دارد.
از مهمترین کاربردهای آن این است که سیستم های اینترنتی جای ذخیره پسورد در دیتابیس hash code پسورد رو ذخیره می کنن و زمانی که کاربر می خواهد وارد شود hash پسورد ورودی رو با hash که در دیتابیس ذخیره شده چک می شه و اگه یکی بود یعنی پسورد درسته

روی صحبت من شما نبودی. تمام راه حل های ارائه شده بود (از جمله پست شما)
من نگفتم hash codeکاربرد وسیعی نداره. خب، داشته باشه.
یه پیشنهاد دوستانه: سعی کن موضوع تاپیک رو بخونی. اینجا جای صحبت در مورد امکانات و کاربرد hash code و اینکه چطور کار میکنه نیست.