چگونه می توان تصویری را با تصویر دیگر در #C مقایسه نمود که تصویر اولی با تصویر دوم یکسان است . و اگر اختلاف داشت چند درصد با هم متفاوتند (بحث پردازش تصویر درC#.net)
عالی
خوب
متوسط
ضعیف
چگونه می توان تصویری را با تصویر دیگر در #C مقایسه نمود که تصویر اولی با تصویر دوم یکسان است . و اگر اختلاف داشت چند درصد با هم متفاوتند (بحث پردازش تصویر درC#.net)
کسی بلد بود بگه که برای من هم سواله!
حدس میزنم که باید یه متدی مثل GetPixel باشه. خواستم این متد رو به PictureBox ربط بدم، که بلد نبودم.
اگر بخواهیم دو عکس را با هم مقایسه کنیم کافی است آن دو را در دو متغیر بایت بریزیم و بایت به بایت به بررسی آنها بپردازیم مانند :
strImgName = openFileDialog.FileName
ByteOfFile = System.IO.File.ReadAllBytes(strImgName
که در آن byteoffile یک متغییر بایتی است :
byte[] ByteOfFile
حال شما 2 تا از این متغییر تعریف کنید و ...
مقایسه بایت به بایت مطلقا یکی از مقایسه های اساسی و خوب به حساب میآد، اگر بخوایم بدونیم که دو تا عکس چند درصد با هم اختلاف دارن میشه از مقایسه بایت به بایت استفاده کرد ولی کمی مشکله که از بایتها سر در بیآریم و نیاز به کار 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 برای این منظور استفاده کرد یا نه...
با این توضیحاتی که شما گفتید یک سوال پیش میاد آنهم اینکه برای مقایسه یک فایل با حجم مثلا 200 کیلو بایت چقدر زمان نیاز است ؟
منظورم مقایسه همه رنگها است .
مقایسات باید پیکسل به پیکسل انجام بشه ، راه دیگه ای هم نداره
می توان دو عکس هم سایز را پیکسل به پیکسل مقایسه کرد و گفت که چقدر با هم تفاوت دارن ( به در صد ) کار راحتیه :D
مقایسه بایت به بایت مطلقا یکی از مقایسه های اساسی و خوب به حساب میآدمیشه منبعتونم ذکر کنید و بگید از روی چه کتابی، مقاله ای یا ... اینو گفتین؟مقایسات باید پیکسل به پیکسل انجام بشه ، راه دیگه ای هم نداره
ظاهرا کلا بحث پردازش تصویر رو شما خلاصه کردین در یه جمله!
فکر کنم زمان زیادی صرف بشه :)
اگه بخوایم سرعت رو بالاتر ببریم، میشه بجای استفاده از خاصیتهای R (مقدار رنگ قرمز) یا G (سبز) یا B (آبی) از یک متد برای مقایسه استفاده کرد و اون متدToArgb()هست، این متد مقدار رنگ رو بصورت یک عدد از نوع int برمیگردونه، (منتهی این متد، مقدار رنگ را بصورت کلی مشخص میکند، یعنی به راحتی نمیشه فهمید که رنگ قرمزش چقدره یا آبیش چقدره، اگر هم بشه من بلد نیستم. متدToArgb()فقط یک کد میده که ترکیبی از رنگهای قرمز و آبی و ... است) و کافیه که، این اعداد رو برای هر پیکسل از هر دو عکس، با هم مقایسه کنیم و هرچه فاصله این اعداد از هم بیشتر باشه، مسلما تفاوت در مقدار رنگ اون پیکسل هم بیشتره. یعنی با کمک این خاصیت، بجای مورد شرط قرار گرفتن سه خاصیت R و G و B از یک متدToArgb()استفاده میکنیم. سرعت بیشتر میشه. به کمک این متد 6 ثانیه طول میکشه که دو فایل 200 کیلوبایتی رو مقایسه کنی.
البته، مطمئنا روش سریعتری هم وجود خواهد داشت. مثلا روشی که از طریق Pointer به پیکسلهای یک Bitmap که در آرایه ذخیره شده باشه، دسترسی داشته باشیم که مطمئنا سریعتر هست. در آدرس زیر یک کلاس نوشته شده که به کمک اون کلاس میتونید از طریق Pointer به آرایهای از پیکسلهای یک Bitmap دسترسی داشته باشید و خودش یک GetPixel جدید توش معرفی کرده که مقدار پیکسل با سرعت بیشتری با همین تکنیک، بدست خواهد آمد، ولی خودم هنوز اون رو امتحان نکردم:
http://www.dreamincode.net/forums/in...6&#entry144886
بله، شما درست میگوئید، من در استفاده از این جمله، بیش از حد عجله کردم.مقایسه بایت به بایت مطلقا یکی از مقایسه های اساسی و خوب به حساب میآد
مشخصات هر پیکسل در هر عکس، در چندین بایت میتواند ذخیره شود (در حالی که من گفته بودم بایت به بایت و بهتر بود میگفتم بایتها با بایتها آنهم نه بایتهائی که حتما متناظر باشند) و از اینکه گفتم اساسی هست، بخاطر این بود که اساس کار خواندن فایلها، این است که فایل را چه بصورت باینری چه متنی (چه بایت بایت یا خط خط یا بیت بیت!!!) خوانده و سپس مقایسه ها را از بین اطلاعات خوانده شده، انجام دهیم.
ولی متاسفانه این جمله ای که بکار بردم (بخصوص کلمه مطلقا)، اصلا جالب نبود ...
بلکه بهتر بود تا این حد عجله نمیکردم، منظور خودم رو بیشتر توضیح میدادم و در یک خط خلاصه نمیکردم.
اما پردازش تصویر چیزی خیلی فراتر از این چیز هاست
یکی از شاخه های هوش مصنوعی است !!! بایت و پیکسل و ... هم نمیشناسد.
من فکر میکنم با استفاده از بایت هم سرعت و هم دقت افزایش پیدا کنه
قفل مخفی تلگرام، واتس اپ و همه برنامه ها - قفل حرفه ای برای دستگاه اندرویدی شما - با امکان مخفی شدن و جلوگیری از Unisntall شدن
--آموزش ایجاد برنامه های چند زبانه در WPF
-BeRMOoDA File Encrypter-open source-using WPF, C# and MVVM Pattern
-نمونه برنامه ساده و کامل با الگوی MVVM برای کار با دیتابیس با استفاده از Entity Framework در WPF
-WPFMessageBox فارسی/انگلیسی - با قابلیت تغییر Skin
ممنون راهنمایی خوبی بود
پیشنهاد می کنم دانلود کنید
سلام. من دارم روی یک پروژه پردازش تصویر کار می کنم که فیلمی را می گیرد و مسیر اجسام متحرک رو تشخیص می ده. من می خواستم frame هایی که دارم رو به grayScale تبدیل کنم. در حالت safe این کار خیلی پردازش میگیره. توی MSDN یک کد هست که حالت unsafe هست و خیلی قشنگه. پیشنهاد می کنم که اون کد رو ببینید. اون کد عکس رنگی رو با سه الگریتم به grayScale تبدیل می کنه
اگه فقط یکی بودن عکسا مهمه میشه از hash code استفاده کرد.
بدین ترتیب که Hash code دو تا عکس رو حساب می کنیم و اگه مساوی بودند دو عکس یکی هستند. (hash code بر اساس بایتهای فایل بدست می آیند و مانند اثر انگشت هستند)
اگه فقط یکی بودن عکسا مهمه میشه از hash code استفاده کرد.
بدین ترتیب که Hash code دو تا عکس رو حساب می کنیم و اگه مساوی بودند دو عکس یکی هستند. (hash code بر اساس بایتهای فایل بدست می آیند و مانند اثر انگشت هستند)
این راه ها هیچ کدوم عملی نیست. این یه مبحث توی هوش مصنوعی هست که به این راحتی ها و با یه برنامه کوچیک و با یه تاپیک درست بشو نیست. کتاب digital image processing دارم که 800 صفحه هست.
من خودم دارم میخونمش. اگه به این موضوع علاقه مندین پیشنهد من اینه که بخونیدش
ظاهرا این تاپیک در زمان خودش هم نتیجه ای نداشته.
hash code کاربرد گسترده ای دارد.
از مهمترین کاربردهای آن این است که سیستم های اینترنتی جای ذخیره پسورد در دیتابیس hash code پسورد رو ذخیره می کنن و زمانی که کاربر می خواهد وارد شود hash پسورد ورودی رو با hash که در دیتابیس ذخیره شده چک می شه و اگه یکی بود یعنی پسورد درسته