• درخواست دمو
  • ۰۳۱-۹۱۰۰۱۸۸۱
بهسان اندیش
  • صفحه اصلی
  • محصولات
    • نرم افزار پلاک خوان
      • نرم افزار ثبت تردد جاده ای
      • نرم افزار مدیریت پارکینگ
      • نرم افزار تعمیرگاه ، کارواش و تعویض روغن
    • نرم افزار باسکول
    • راهکارهای سازمانی
      • نرم افزارانبار و حساب داری
    • محصولات جانبی
      • دوربین پلاک خوان
      • ماژول رله کنترل راهبند
  • نمونه کارها
    • سامانه جامع پلاکخوان خودرو
    • سامانه جامع مدیریت باسکول
    • سامانه قرائت فرم های چند گزینه ای
  • وبلاگ
  • ارتباط با ما
    • تماس با ما
    • درباره ما
    • دعوت به همکاری
  • جستجو
  • منو منو

بایگانی برچسب برای: پرسشیار

آشنایی با Thread های Foreground و Background

آموزش های زبان برنامه نویسی سی شارپ

کار با Thread ها در زبان سی شارپ – آشنایی با Thread های Foreground و Background در دات نت

زمانی که یک Thread جدید در برنامه های دات نت ایجاد می شوند، این Thread ها می توانند به دو صورت Foreground و Background اجرا شوند:

  1. Thread های Foreground: زمانی که کی Thread در حالت Foreground اجرا می شود باعث می شود که Thread اصلی برنامه تا زمان کامل شدن اجرای Thread ایجاد شده در حالت اجرا بماند. یعنی از Shut-down شدن Primary Thread توسط CLR جلوگیری می شود.
  2. Thread های Background: این Thread ها که با نام Daemon Thread شناخته می شوند به CLR می گوید که اجرای این Thread آنقدر اهمیت ندارد که Thread اصلی برنامه بخواهد منتظر بماند تا عملیات آن به اتمام برسد و می تواند در هر زمان که Thread اصلی برنامه به اتمام رسید، به صورت خودکار Thread های Background را نیز از بین ببرد.

توجه کنید که کلیه Thread هایی که در برنامه ها ایجاد می کنیم به صورت پیش فرض در حالت Foreground قرار دارند. برای آشنایی بیشتر با این موضوع نمونه کد زیر را در نظر بگیرید:

static void Main(string[] args)
{
    var thread = new Thread(PrintNumbers);
    thread.Start();
}

public static void PrintNumbers()
{
    for (int counter = 1; counter < 10; counter++)
    {
        Console.WriteLine(counter);
        Thread.Sleep(200);
    }
}

همانطور که گفتیم Thread ایجاد شده به صورت پیش فرض از نوع Foreground است و به همین دلیل تا زمانی که روند اجرای Thread ایجاد شده به اتمام نرسد از برنامه خارج نمی شویم و کلیه اعداد در خروجی چاپ می شوند. اما در کد زیر Thread ایجاد شده به صورت Background است و خواهیم دید که پس از اجرای برنامه به دلیل اینکه Thread اصلی زودتر از Thread ایجاد شده به اتمام می رسد، CLR به صورت خودکار Thread ایجاد شده را از بین می برد و اعداد به صورت کامل در خروجی نمایش داده نمی شوند:

static void Main(string[] args)
{
    var thread = new Thread(PrintNumbers);
    thread.IsBackground = true;
    thread.Start();
}

public static void PrintNumbers()
{
    for (int counter = 1; counter < 10; counter++)
    {
        Console.WriteLine(counter);
        Thread.Sleep(200);
    }
}

در برنامه های واقعی باید با دقت نوع Thread ها را انتخاب کرد، برای مثال فرض کنید که در برنامه شما در یک Thread جداگانه عملیاتی بر روی داده های بانک اطلاعاتی انجام می شود و نتیجه این عملیات در انتها باید در جایی ذخیره شود، می توانید برای اینکار یک Thread از نوع Foreground ایجاد کرده تا پس از خروج از برنامه، Thread اصلی منتظر اتمام انجام عملیات شده و سپس عملیات خروج کامل انجام شود. در مبحث بعدی در مورد موضوع همزمانی یا Concurrency صحبت می کنیم که از مشکلات اساسی در زمینه برنامه نویسی asynchronous می باشد و در مورد راهکار های حل این مشکل نیز صحبت خواهیم کرد.

منبع


قسمت اول آموزش-برنامه نویسی Asynchronous – آشنایی با Process ها، Thread ها و AppDomain ها

قسمت دوم آموزش- آشنایی با ماهیت Asynchronous در Delegate ها

قسمت سوم آموزش-آشنایی با فضای نام System.Threading و کلاس Thread

قسمت چهارم آموزش- آشنایی با Thread های Foreground و Background در دات نت

قسمت پنجم آموزش- آشنایی با مشکل Concurrency در برنامه های Multi-Threaded و راهکار های رفع این مشکل

قسمت ششم آموزش- آشنایی با کلاس Timer در زبان سی شارپ

قسمت هفتم آموزش-آشنایی با CLR ThreadPool در دات نت

قسمت هشتم آموزش- مقدمه ای بر Task Parallel Library و کلاس Parallel در دات نت

قسمت نهم آموزش- برنامه نویسی Parallel:آشنایی با کلاس Task در سی شارپ

قسمت دهم آموزش-برنامه نویسی Parallel در سی شارپ :: متوقف کردن Task ها در سی شارپ – کلاس CancellationToken

قسمت یازدهم آموزش- برنامه نویسی Parallel در سی شارپ :: کوئری های Parallel در LINQ

قسمت دوازدهم آموزش- آشنایی با کلمات کلیدی async و await در زبان سی شارپ

قسمت سیزدهم آموزش- استفاده از متد WhenAll برای اجرای چندین Task به صورت همزمان در سی شارپ

آوریل 6, 2020/0 دیدگاه /توسط daliri
https://behsanandish.com/wp-content/uploads/2018/08/images-5-1.jpg 344 304 daliri https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png daliri2020-04-06 10:00:422020-04-06 10:00:42آشنایی با Thread های Foreground و Background

حذف نویز تصویر به کمک هوش مصنوعی

وبلاگ

مقدمه

حذف نویز تصاویر _ گروهی از محققان سیستمی را توسعه داده اند که با استفاده از هوش مصنوعی و بدون نیاز به عکس های واضح از منبع، نویز تصاویر را از بین می برد.

شرح خبر

این گروه متشکل از محققان انویدیا، MIT و دانشگاه آلتو در توسعه این سیستم از یادگیری عمیق بهره برده اند که بر خلاف روش های قبلی نیازی به مشاهده نمونه های کامل از تصویر مورد نظر داشته و تنها با استفاده از داده های ناقص یا دو تصویر غیر واضح به افزایش کیفیت تصاویر می پردازد. علاوه بر این نتیجه نهایی افزایش کیفیت، حذف متون یا اصلاح تصویر نسبت به روش های قبلی به مراتب بهتر است.

یادگیری عمیق گونه ای از یادگیری ماشینی است که در آن سیستم با کمک هوش مصنوعی نحوه بازیابی تصاویر دارای نویز از طریق کنار هم قرار دادن تصاویر، متون یا ویدیوها را فرا می گیرد. یکی دیگر از قابلیت های جالب توجه سیستم جدید افزایش کیفیت تصاویر در عرض چند میلی ثانیه است.
مبنای کار هوش مصنوعی در این سیستم بر شبکه عصبی استوار است که با استفاده از تصاویر دارای نویز آموزش دیده است. در این روش هوش مصنوعی علی رغم عدم نیاز به تصاویر واضح از منبع باید دوبار تصویر را مشاهده کند.

آزمایشات این گروه نشان داده که از تصاویر تخریب شده از طریق نویزهایی نظیر «گاوسی افزایشی»، «پواسون» یا ترکیب آنها می توان برای تولید تصاویر بهینه ای استفاده کرد که کیفیت آن‌ها با تصاویر بازیابی‌ شده از عکس های بدون مشکل تقریبا برابر است.
کاربردهای علمی این سیستم مبتنی بر یادگیری عمیق شامل زمینه های پزشکی است که در آن می توان کیفیت اسکن های MRI و تصاویر دیگر را به شکل چشمگیری افزایش داد.

چند ماه قبل نیز تیم تحقیقاتی انستیتوی «ماکس پلانک» به رهبری دکتر مهدی سجادی، الگوریتمی را توسعه داده بودند که با بهره گیری از هوش مصنوعی وضوح تصاویر بی کیفیت را تا حد زیادی بهبود می بخشید.

مارس 27, 2020/0 دیدگاه /توسط admin
https://behsanandish.com/wp-content/uploads/2018/07/photo_2018-07-25_11-18-06.jpg 380 600 admin https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png admin2020-03-27 10:00:282020-03-27 10:00:28حذف نویز تصویر به کمک هوش مصنوعی

مقالات و جزوات آموزشی پیرامون هیستوگرام

آموزش عمومی پردازش تصویر و بینایی ماشین, مقالات

مقالات

1.بررسی روشهای متعادل سازی هیستوگرام در بهبود تصویر

چکیده: افزایش کنتراست به عنوان یکی از مسائل مهم در پردازش تصویر است.متعادل سازی هیستوگرام (HE) یکی از روش های معمول برای بهبود کنتراست در تصاویر دیجیتال است و یک روش افزایش کنتراست ساده و موثر است با این حال، این روش معمولا باعث کنتراست بیش از حد می شود که باعث ظاهر غیر طبیعی در تصویر پردازش شده می شود. هم چنین HE میانگین روشنایی تصویر را به خوبی حفظ نمی کند بنابراین روش های دیگری برای متعادل سازی تصویر با حفظ روشنایی تصویر ارائه شده است. این مقاله به بررسی فرم های جدید هیستوگرام برای افزایش کنتراست تصویر می پردازد. تفاوت عمده میان روش ها معیارهای مورد استفاده، تقسیم هیستوگرام ورودی است. متعادل سازی دو هیستوگرام با حفظ روشنایی(BBHE) میانگین مقادیر شدت به عنوان نقطه جداسازی استفاده می کند. متعادل سازی دو هیستوگرام با حداقل خطای متوسط روشنایی(MMBEBHE) است. متعادل سازی هیستوگرام متوسط – مجرای بازگشتی(RMSHE) بهبود یافته BBHE است. روش یکنواخت سازی پویلی هیستوگرام با حفظ روشنایی(BPDHE) بسط یافته MPHBP و DHE است.
واژه های کلیدی: بهبود کنتراست، متعادل سازی هیستوگرام، خطای متوسط روشنایی، تقسیم بندی هیستوگرام، حفظ روشنایی
فایل PDF – در 22 صفحه- نویسنده : نوشین الله بخشی

بررسی روشهای متعادل سازی هیستوگرام در بهبود تصویر

رمز فایل : behsanandish.com


2. بهبود کیفیت تصاویر آندوسکوپی از طریق تعدیل هیستوگرام فازی و توزیع ناهمسانگرد کنتراست

چکیده: در این مقاله روشی جدید برای بهبود کیفیت تصاویر آندوسکوپی به وسیله ی تعدیل هیستوگرام فازی و توزیع ناهمسانگرد کنتراست ارائه می شود. تصاویر آندوسکوپی موجود در کشورمان از لحاظ نور و کیفیت وضعیت مناسبی ندارند و همین موضوع تبدیل به چالشی جهت تشخیص انواع بیماری های دستگاه گوارش شده است. برای غلبه بر این مشکلات و کمک به پزشکان برای تشخیص بهتر، در این مقاله یک روش وفقی با استفاده از تعدیل هیستوگرام فازی و توزیع کنتراست ارائه می شود. همچنین در روش پیشنهادی مفهوم جدیدی از توزیع کنتراست بر اساس آنالیز محلی تصاویر آندوسکوپی معرفی می شود. سپس به وسیله انتخاب وفقی پارامتر هدایت که نقشی مهم در توزیع ایفا می کند، توزیع کنتراست به منظور بهبود کیفیت تصاویر آندوسکوپی به تصویر اعمال می شود و در نهایت بعد از انتقال به سه فضای رنگ YIQ ،XYZ و HSI به کمک روش تعدیل هیستوگرام فازی، تغییرات نامحسوس رنگ نمایان تر می شود. نتایج تجربی نشان می دهد که روش ارئه شده عملکرد قابل توجهی در افزایش قابلیت دیداری تصاویر آندوسکوپی از خود نشان می دهد.

 

واژه های کلیدی: تصاویر آندوسکوپی، توزیع ناهمسانگرد کنتراست، تعدیل هیستوگرام فازی

فایل PDF – در 6 صفحه- نویسندگان : حسین قیصری، میرحسین دزفولیان

بررسی روشهای متعادل سازی هیستوگرام در بهبود تصویر

رمز فایل : behsanandish.com


3. تشخیص زود هنگام پوسیدگی دندان با استفاده از آنالیز هیستوگرام و طیف توان

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

واژه های کلیدی: پوسیدگی دندان، هیستوگرام، طیف توان، GUI، شدت پیکسل

فایل PDF – در 6 صفحه- نویسندگان : محمد کریمی مریدانی، شبنم قهاری و فاطمه غلامی

تشخیص زود هنگام پوسیدگی دندان با استفاده از آنالیز هیستوگرام و طیف توان

رمز فایل : behsanandish.com


4. بازیابی تصاویر چهره با استفاده از ترکیب هیستوگرام گرادیان و الگوی باینری محلی

چکیده: بازیابی چهره، یک موضوع تحقیقاتی مهم در پردازش تصویر است که هدف آن استخراج تصاویر چهره ای است که مشابه با یک تصویر جستار باشند. در این مقاله روشی برای بازیابی تصاویر چهره با استفاده از ترکیب هیستوگرام گرادیان و الگوی باینری محلی(LBP) پیشنهاد شده است. ترکیب این دو روش مقاومت در مقابل تغییرات موجود در تصاویر چهره را افزایش می دهد و در نتیجه عملکرد سیستم را در بازیابی تصاویر بهبود می بخشد. برای افزایش توانایی سیستم، یک طرح فیدبک ارتباطی مبتنی بر ماشین بردار پشتیبان(SVM) معرفی می کنیم. آزمایش ها بر روی پایگاه داده ی AR و در دو حالت بدون تصاویر با مانع و با تصاویر با مانع اناجم شده است. نتایج آزمایش ها نشان می دهد که روش پیشنادی ما به خوبی می تواند تصاویر چهره را بازیابی کند. در ادامه، روش پیشنهادی خود را با برخی از روش های موفق در توصیف چهره مقایسه کرده ایم. معیار دقت متوسط میانگین(MAP) برای روش پیشنهادی در حالت های اول و دوم آزمایش به ترتیب برابر است با 94/40%  و 68/12%. در حالی که بهترین نرخ برای روش های مقایسه شده برابر است با 90/37% و 61/99%. این نتایج نشان می دهد روش پیشنهادی ما نسبت به این روش ها بهتر عمل می کند و یک روش خوب برای بازیابی تصاویر چهره است.

واژه های کلیدی: الگوی باینری محلی، بازیابی چهره، فیدبک ارتباطی، ماشین بردار پشتیبان، هیستوگرام گرادیان.

فایل PDF – در 11 صفحه- نویسندگان : محمد قاصری و حسین ابراهیم نژاد

ﺑﺎزﯾﺎﺑﯽ ﺗﺼﺎوﯾﺮ ﭼﻬﺮه ﺑﺎ اﺳﺘﻔﺎده از ﺗﺮﮐﯿﺐ ﻫﯿﺴﺘﻮﮔﺮام ﮔﺮادﯾﺎن و اﻟﮕﻮی ﺑﺎﯾﻨﺮی ﻣﺤﻠﯽ

رمز فایل : behsanandish.com


5. بهبود وفقی کنتراست با استفاده از متعادل سازی بهینه هیستوگرام دو بعدی

چکیده: در این مقاله، برای بهبود وفقی کنتراست به ارائه و حل یک مسئله ی بهینه سازی در هیستوگرام دوبعدی پرداخته شده است. برای جلوگیری از بروز اثرات نامطلوب ناشی از دست کاری هیستوگرام تصویر، در بیان ریاضی مسأله در این مقاله همانند روش های مشابه دیگر، از یک سو هیستوگرام بهینه ی خروجی از روی هیستوگرامی دوبعدی که بیشترین شباهت را به هیستوگرام دوبعدی تصویر ورودی و نیز توزیع یکنواخت داشته باشد به دست می آید و از سویی دیگر بر خلاف دیگر روش ها، با وزن دهی وفقی، اطلاعات محلی مناسبی را نیز دراین جستجو در نظر می گیرد. نگاشت مناسب با حل این مسأله ی بهینه سازی به دست آمده و آزمایش های گوناگونی که بر روی تصاویر گوناگون انجام شده است، درستی مدل بهینه سازی را نشان می دهد. به کارگیری الگوریتم پیشنهادی بر روی تصاویر متعدد، در مقایسه با روش مرجع به صورت میانگین به بهبود 75 درصدی و 3 درصدی معیارهای AMBEN  و  DEN  منجر شده است.

واژه های کلیدی: بهبود کنتراست، هیستوگرام دوبعدی، هموارسازی هیستوگرام

فایل PDF – در 10 صفحه- نویسندگان : سحر ایروانی و مهدی ازوجی

ﺑﻬﺒﻮد وﻓﻘﯽ ﮐﻨﺘﺮاﺳﺖ ﺑﺎ اﺳﺘﻔﺎده از ﻣﺘﻌﺎدل ﺳﺎزی ﺑﻬﯿﻨﻪ ی ﻫﯿﺴﺘﻮﮔﺮام دوﺑﻌﺪی

رمز فایل : behsanandish.com


6. A Study for Applications of Histogram in Image Enhancement

مطالعه برای کاربرد هیستوگرام در بهبود تصویر

Abstract- Image Enhancement aims at improving the visual quality of input image for a particular area. The criterion used by enhancement algorithms to enhance the image is; using histogram details of that image. This paper defines the various applications of histograms through which they help in the enhancement process. The paper also represents three basic histogram processing techniques- histogram sliding, histogram stretching, and histogram equalization, and how these techniques help in enhancement process, which factors effect these techniques. We examine subjectively the effect of these processing techniques. Comparative analysis of these techniques is also carried out.

Keywords: Histogram Equalization, Histogram Sliding, Histogram Stretching, Image Enhancement, Visual Quality.

فایل PDF – در 5 صفحه- نویسندگان : Harpreet Kaur, Neelofar Sohi

A Study for Applications of Histogram in Image Enhancement

رمز فایل : behsanandish.com


7. An Adaptive Histogram Equalization Algorithm on the Image Gray Level Mapping

الگوریتم انعکاس هیستوگرام سازگار بر روی نقشه سطح خاکستری تصویر

Abstract
The conventional histogram equalization algorithm is easy causing information loss. The paper presented an adaptive histogram-based algorithm in which the information entropy remains the same. The algorithm introduces parameter ȕ in the gray level mapping formula, and takes the information entropy as the target function to adaptively adjust the spacing of two adjacent gray levels in the new histogram. So it avoids excessive gray pixel merger and excessive bright local areas of the image. Experiments show that the improved algorithm may effectively improve visual effects under the premise of the same information entropy. It is useful in CT image processing.

Keywords: Histogram Equalization; Image Enhancement; Gray Level Mapping; Information Entropy

فایل PDF – در 8 صفحه- نویسندگان : Youlian Zhu, Cheng Huang

An Adaptive Histogram Equalization Algorithm on the Image

رمز فایل : behsanandish.com


8. Contrast Enhancement Algorithm Based on Gap Adjustment for Histogram Equalization

الگوریتم تقویت کنتراست براساس تنظیم گاف برای برابری هیستوگرام

Abstract: Image enhancement methods have been widely used to improve the visual effects of images. Owing to its simplicity and effectiveness histogram equalization (HE) is one of the methods used for enhancing image contrast. However, HE may result in over-enhancement and feature loss problems that lead to unnatural look and loss of details in the processed images. Researchers have proposed various HE-based methods to solve the over-enhancement problem; however, they have largely ignored the feature loss problem. Therefore, a contrast enhancement algorithm based on gap adjustment for histogram equalization (CegaHE) is proposed. It refers to a visual contrast enhancement algorithm based on histogram equalization (VCEA), which generates visually pleasing enhancedimages,andimprovestheenhancementeffectsofVCEA.CegaHEadjuststhegapsbetween two gray values based on the adjustment equation, which takes the properties of human visual perception into consideration, to solve the over-enhancement problem. Besides, it also alleviates the feature loss problem and further enhances the textures in the dark regions of the images to improve the quality of the processed images for human visual perception. Experimental results demonstrate that CegaHE is a reliable method for contrast enhancement and that it significantly outperforms VCEA and other methods.

Keywords: cumulative distribution function (CDF); contrast enhancement; histogram equalization (HE); human visual perception; gap adjustment

فایل PDF – در 18 صفحه- نویسندگان : Chung-Cheng Chiu , and Chih-Chung Ting

Contrast Enhancement Algorithm Based on Gap

رمز فایل : behsanandish.com


9. Enhancement of Images Using Histogram Processing Techniques

بهبود تصاویر با استفاده از تکنیک های پردازش هیستوگرام

Abstract- Image enhancement is a mean as the improvement of an image appearance by increasing dominance of some features or by decreasing ambiguity between different regions of the image. Image enhancement processes consist of a collection of techniques that seek to improve the visual appearance of an image or to convert the image to a form better suited for analysis by a human or machine. Many images such as medical images, remote sensing images, electron microscopy images and even real life photographic pictures, suffer from poor contrast. Therefore it is necessary to enhance the contrast.The purpose of image enhancement methods is to increase image visibility and details. Enhanced image provide clear image to eyes or assist feature extraction processing in computer vision system. Numerous enhancement methods have been proposed but the enhancement efficiency, computational requirements, noise amplification, user intervention, and application suitability are the common factors to be considered when choosing from these different methods for specific image processing application.

Keywords: Enhancement, Histogram processing techniques, PSNR,MSE.

فایل PDF – در 5 صفحه- نویسندگان :Komal Vij , Yaduvir Singh

Enhancement of Images Using Histogram Processing

رمز فایل : behsanandish.com


10. USE OF HISTOGRAM EQUALIZATION IN IMAGE PROCESSING FOR IMAGE ENHANCEMENT

استفاده از تعادل هیستوگرام در پردازش تصویر برای افزایش تصویر

Abstract— Digital Image Processing is a rapidly evolving field with the growing applications in science & engineering. Image Processing holds the possibility of developing an ultimate machine that could perform visual functions of all living beings. The image processing is a visual task, the foremost step is to obtain an image i.e. image acquisition then enhancement and finally to process. In this paper there are details for image enhancement for the purpose of image processing. Image enhancement is basically improving the digital image quality. Image histogram is helpful in image enhancement. The histogram in the context of image processing is the operation by which the occurrences of each intensity value in the image is shown and Histogram equalization is the technique by which the dynamic range of the histogram of an image is increased.

Keywords- Image processing, image enhancement, image histogram, Histogram equalization

فایل PDF – در 5 صفحه- نویسندگان :Sapana S. Bagade , Vijaya K. Shandilya

USE OF HISTOGRAM EQUALIZATION IN IMAGE PROCESSING FOR IMAGE ENHANCEMENT

رمز فایل : behsanandish.com


جزوات آموزشی

1. Computer Vision – Histogram Processing

1. بینایی کامپیوتر- پردازش هیستوگرام

فایل PDF – در 40 صفحه- نویسنده : Dr. S. Das 

Computer Vision -histogram processing

رمز فایل : behsanandish.com


2. Digital Image Processing (CS/ECE 545)  Lecture 2: Histograms and Point Operations (Part 1)

پردازش تصویر دیجیتال(CS/ECE 545)  درس 2: هیستوگرام و عملیات نقطه

فایل PDF – در 56 صفحه- نویسنده : Prof Emmanuel Agu

Digital Image Processing-histograms and point operations

رمز فایل : behsanandish.com


3. Part 3: Image Processing – Digital Images and Intensity Histograms

بخش 3: پردازش تصویر – تصاویر دیجیتال و هیستوگرام های شدت

فایل PDF – در 57 صفحه- نویسنده : Georgy Gimel’farb

Digital Images and Intensity Histograms

رمز فایل : behsanandish.com


4.  Digital Imaging and Multimedia Histograms of Digital Images

تصویربرداری دیجیتالی و هیستوگرام های چند رسانه ای از تصاویر دیجیتال

فایل PDF – در 12 صفحه- نویسنده : Ahmed Elgammal

Digital Imaging and Multimedia

رمز فایل : behsanandish.com

مارس 23, 2020/0 دیدگاه /توسط daliri
https://behsanandish.com/wp-content/uploads/2018/04/hist.jpg 256 256 daliri https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png daliri2020-03-23 10:00:552020-03-23 10:00:55مقالات و جزوات آموزشی پیرامون هیستوگرام

رباتیک چیست؟ قسمت 2

آموزش های عمومی هوش مصنوعی

مهندسی رباتیک چیست ؟

مهندسی رباتیک چیست ؟

ربات چيست؟

ربات يك ماشين الكترومكانيكي هوشمند است با خصوصيات زير:
– مي توان آن را مكرراً برنامه ريزي كرد.
– چند كاره است.
– كارآمد و مناسب براي محيط است.

اجزاي يك ربات

– وسايل مكانيكي و الكتريكي:
شاسي، موتورها، منبع تغذيه، …
– حسگرها (براي شناسايي محيط):
دوربين ها، سنسورهاي sonar، سنسورهاي ultrasound، …
– عملكردها (براي انجام اعمال لازم)
بازوي روبات، چرخها، پاها، …
– قسمت تصميم گيري (برنامه اي براي تعيين اعمال لازم):
حركت در يك جهت خاص، دوري از موانع، برداشتن اجسام، …
– قسمت كنترل (براي راه اندازي و بررسي حركات روبات):
نيروها و گشتاورهاي موتورها براي سرعت مورد نظر، جهت مورد نظر، كنترل مسير، ..

تاريخچه رباتيك:

– 270 ق م : زماني كه يونانيان به ساخت مجسمه هاي متحرك ميپرداختند.
– حدود سال 1250 م: بيشاپ آلبرتوس ماگنوس (Bishop Albertus Magnus) ضيافتي ترتيب داد كه درآن، ميزبانان آهني از مهمانان پذيرايي مي كردند. با ديدن اين روبات، سنت توماس آكويناس (Thomas Aquinas) برآشفته شد، ميزبان آهني را تكه تكه كرد و بيشاب را ساحر و جادوگر خواند.
– سال 1640 م: دكارت ماشين خودكاري به صورت يك خانم ساخت و آن را Ma fille Francine ” مي ناميد.اين ماشين كه دكارت را در يك سفر دريايي همراهي مي كرد، توسط كاپيتان كشتي به آب پرتاب شد چرا كه وي تصور مي كرد اين موجود ساخته شيطان است.
– سال 1738 م: ژاك دواكانسن (Jacques de Vaucanson) يك اردك مكانيكي ساخت كه از بيش از 4000 قطعه تشكيل شده بود. اين اردك مي توانست از خود صدا توليد كند، شنا كند، آب بنوشد، دانه بخورد و آن را هضم و سپس دفع كند. امروزه در مورد محل نگهداري اين اردك اطلاعي در دست نيست.
– سال 1805 م: عروسكي توسط ميلاردت (Maillardet) ساخته شد كه مي توانست به زبان انگليسي و فرانسوي بنويسد و مناظري را نقاشي كند.
– سال 1923 م: كارل چاپك (Karel Capek) براي اولين بار از كلمه روبات (robot) در نمايشنامه خود به عنوان آدم مصنوعي استفاده كرد. كلمه روبات از كلمه چك robota گرفته شده است كه به معني برده و كارگر مزدور است. موضوع نمايشنامه چاپك، كنترل انسانها توسط روباتها بود، ولي او هرگونه امكان جايگزيني انسان با روبات و يا اينكه روباتها از احساس برخوردار شوند، عاشق شوند، يا تنفر پيدا كنند را رد مي كرد.
– سال 1940 م: شركت وستينگهاوس (Westinghouse Co.) سگي به نام اسپاركو (Sparko) ساخت كه هم از قطعات مكانيكي و هم الكتريكي در ساخب آن استفاده شده بود. اين اولين باري بود كه از قطعات الكتريكي نيز همراه با قطعات مكانيكي استفاده مي شد.
– سال 1942 م: كلمه روباتيك (robatics) اولين بار توسط ايزاك آسيموف در يك داستان كوتاه ارائه شد. ايزاك آسيموف (1920-1992) نويسنده كتابهاي توصيفي درباره علوم و داستانهاي علمي تخيلي است.
– دهه 1950 م: تكنولوژي كامپيوتر پيشرفت كرد و صنعت كنترل متحول شد. سؤلاتي مطرح شدند. مثلاً: آيا كامپيوتر يك روبات غير متحرك است؟
– سال 1954 م: عصر روبات ها با ارائه اولين روبات آدم نما توسط جرج دوول (George Devol) شروع شد.
– سال 1956 م: پس از توسعه فعاليتهاي تكنولوژي يك كه بعد از جنگ جهاني دوم، يك ملاقات تاريخي بين جورج سي.دوول(George C.Devol) مخترع و كارآفرين صاحب نام، و ژوزف اف.انگلبرگر (Joseph F.Engelberger) كه يك مهندس با سابقه بود، صورت گرفت. در اين ملاقات آنها به بحث در مورد داستان آسيموف پرداختند. ايشان سپس به موفقيتهاي اساسي در توليد روباتها دست يافتند و با تأسيس شركتهاي تجاري، به توليد روبات مشغول شدند. انگلبرگر شركت Unimate برگرفته از Universal Automation را براي توليد روبات پايه گذاري كرد. نخستين روباتهاي اين شركت در كارخانه جنرال موتورز (General Motors) براي انجام كارهاي دشوار در خودروسازي به كار گرفته شد. انگلبرگر را “پدر روباتيك” ناميده اند.
– دهه 1960 م: روباتهاي صنعتي زيادي ساخته شدند. انجمن صنايع روباتيك اين تعريف را براي روبات صنعتي ارائه كرد:
“روبات صنعتي يك وسيلة چند كاره و با قابليت برنامه ريزي چند باره است كه براي جابجايي قطعات، مواد، ابزارها يا وسايل خاص بوسيلة حركات برنامه ريزي شده، براي انجام كارهاي متنوع استفاده مي شود.”
– سال 1962 م: شركت خودروسازي جنرال موتورز نخستين روبات Unimate را در خط مونتاژ خود به كار گرفت.
– سال 1967 م: رالف موزر (Ralph Moser) از شركت جنرال الكتريك (General Electeric) نخستين روبات چهارپا را اختراع كرد.
– سال 1983 م: شركت Odetics يك روبات شش پا ارائه كرد كه مي توانست از موانع عبور كند و بارهاي سنگيني را نيز با خود حمل كند.
– سال 1985 م: نخستين روباتي كه به تنهايي توانايي راه رفتن داشت در دانشگاه ايالتي اهايو (Ohio State Uneversity) ساخته شد.
– سال 1996 م: شركت ژاپني هندا (Honda) نخستين روبات انسان نما را ارائه كرد كه با دو دست و دو پا طوري طراحي شده بود كه مي توانست راه برود، از پله بالا برود، روي صندلي بنشيند و بلند شود و بارهايي به وزن 5 كيلوگرم را حمل كند
روباتها روز به روز هوشمندتر مي شوند تا هرچه بيشتر در كارهاي سخت و پر خطر به ياري انسانها بيايند.
امروزه، 90% روباتها، روباتهاي صنعتي هستند، يعني روباتهايي كه در كارخانه ها، آزمايشگاهها، انبارها، نيروگاهها، بيمارستانها، و بخشهاي مشابه به كارگرفته مي شوند.در سالهاي قبل، اكثر روباتهاي صنعتي در كارخانه هاي خودروسازي به كارگرفته مي شدند، ولي امروزه تنها حدود نيمي از روباتهاي موجود در دنيا در كارخانه هاي خودروسازي به كار گرفته مي شوند.مصارف روباتها در همه ابعاد زندگي انسان به سرعت در حال گسترش است تا كارهاي سخت و خطرناك را به جاي انسان انجام دهند.براي مثال امروزه براي بررسي وضعيت داخلي رآكتورها از روبات استفاده مي شود تا تشعشعات راديواكتيو به انسانها صدمه نزند.

3 قانون روباتيك مطرح شده توسط آسيموف:

1- روبات ها نبايد هيچگاه به انسانها صدمه بزنند.
2- روباتهابايد دستورات انسانها را بدون سرپيجي از قانون اوّل اجرا كنند.
3- روباتها بايد بدون نقض قانون اوّل و دوم از خود محافظت كنند.

انواع ربات ها :

رباتهاي امروزي كه شامل قطعات الكترونيكي و مكانيكي هستند در ابتدا به صورت بازوهاي مكانيكي براي جابجايي قطعات و يا كارهاي ساده و تكراري كه موجب خستگي و عدم تمركز كارگر و افت بازده ميشد بوجود آمدند. اينگونه رباتها جابجاگر (manipulator) نام دارند. جابجاگرها معمولا در نقطه ثابت و در فضاي كاملا كنترل شده در كارخانه نصب ميشوند و به غير از وظيفه اي كه به خاطر آن طراحي شده اند قادر به انجام كار ديگري نيستند. اين وظيفه ميتواند در حد بسته بندي توليدات, كنترل كيفيت و جدا كردن توليدات بي كيفيت, و يا كارهاي پيچيده تري همچون جوشكاري و رنگزني با دقت بالا باشد.
نوع ديگر رباتها كه امروزه مورد توجه بيشتري است رباتهاي متحرك هستند كه مانند رباتهاي جابجا كننده در محيط ثابت و شرايط كنترل شده كار نميكنند. بلكه همانند موجودات زنده در دنياي واقعي و با شرايط واقعي زندگي ميكنند و سير اتفاقاتي كه ربات بايد با انها روبرو شود از قبل مشخص نيست. در اين نوع ربات هاست كه تكنيك هاي هوش مصنوعي ميبايست در كنترلر ربات(مغز ربات) به كار گرفته شود.

رباتهاي متحرك به دسته هاي زير تقسيم بندي ميشوند:

1-رباتهاي چرخ دار
با انواع چرخ عادي
و يا شني تانك
و با پيكربندي هاي مختلف يك, دو يا چند قسمتي
2-رباتهاي پادار مثل سگ اسباب بازيAIBO ساخت سوني كه در شكل بالا نشان داده شد يا ربات ASIMO ساخت شركت هوندا
3-رباتهاي پرنده
4-رباتهاي چند گانه(هايبريد) كه تركيبي از رباتهاي بالا يا تركيب با جابجاگرها هستند
و …

مزاياي روباتها:

1- روباتيك و اتوماسيون در بسياري از موارد مي توانند ايمني، ميزان توليد، بهره و كيفيت محصولات را افزايش دهند.
2- روباتها مي توانند در موقعيت هاي خطرناك كار كنند و با اين كار جان هزاران انسان را نجات دهند.
3- روباتها به راحتي محيط اطراف خود توجه ندارند و نيازهاي انساني براي آنها مفهومي ندارد. روباتها هيچگاه خسته نمي شوند.
4- دقت روباتها خيلي بيشتر از انسانها است آنها در حد ميلي يا حتي ميكرو اينچ دقت دارند.
5- روباتها مي توانند در يك لحظه چند كار را با هم انجام دهند ولي انسانها در يك لحظه تنها يك كار انجام مي دهند.

معايب روباتها:

1- روباتها در موقعيتهاي اضطراري توانايي پاسخگويي مناسب ندارند كه اين مطلب مي تواند بسيار خطرناك باشد.
2- روباتها هزينه بر هستند.
3- قابليت هاي محدود دارند يعني فقط كاري كه براي آن ساخته شده اند را انجام مي دهند.

 

منبع

 


کلمه ربات توسط Karel Capek نویسنده نمایشنامه ( R.U.R  عقل ربات های جهانی) در سال 1920 ابداع شد. ریشه این کلمه، کلمه چک اسلواکی (robotnic) به معنی کارگر می‌باشد.

امروزه معمولاً کلمه ربات به معنی هر ماشین ساخت بشر که بتواند کار یا عملی که به‌طور طبیعی توسط انسان انجام می‌شود را انجام دهد، استفاده می‌شود.

رباتیک چیست ؟

رباتیک شاخه ای از مهندسی مکانیک، مهندسی برق، مهندسی الکترونیک و علوم کامپیوتر است که به طراحی، ساخت، بهره برداری و استفاده از ربات می پردازد. رباتیک فن‌اوری جدیدی نیست ولی توانایی کاربردش در تمام‌ عرصه‌های علوم و تاثیرش در فناوری‌های دیگر اهمیت زیادی دارد.

 

رباتیک چیست

 

منظور از ربات های صنعتی چیست ؟

امروزه، 90% رباتها، رباتهای صنعتی هستند، یعنی رباتهایی که در کارخانه ها، آزمایشگاهها، انبارها، نیروگاهها، بیمارستانها، و بخشهای مشابه به کارگرفته می شوند.در سالهای قبل، اکثر رباتهای صنعتی در کارخانه های خودروسازی به کارگرفته می شدند، ولی امروزه تنها حدود نیمی از رباتهای موجود در دنیا در کارخانه های خودروسازی به کار گرفته می شوند.

ربات‌ها از چه ساخته می‌شوند؟

ربات‌ها دارای سه قسمت اصلی هستند:

  • مغز که معمولاً یک کامپیوتر است.
  • محرک و بخش مکانیکی شامل موتور، پیستون، تسمه، چرخ‌ها، چرخ دنده‌ها و …
  • سنسور که می‌تواند از انواع بینایی، صوتی، تعیین دما، تشخیص نور، تماسی یا حرکتی باشد.با این سه قسمت، یک ربات می‌تواند با اثرپذیری و اثرگذاری در محیط کاربردی‌تر شود.

رباتیک چیست2

جنبه های رباتیک

نمی توان گفت که انواع مختلفی از رباتها وجود دارند. آنها با توجه به محیط ها و کاربردهای مختلف ساخته می شوند که باعث می شود دارای اشکال و نرم افزارهای مختلفی باشند ، اما در ساخت همه ی آنها سه موضوع مشترک وجود دارد :

  • قطعات مکانیکی مانند قاب ، فرم ، طراحی شکل ربات
  • قطعات الکتریکی مانند مدارهای کنترلی و باتری
  • کد های برنامه نویسی که باعث می شود یک ربات تحت شرایط خاص چگونه عمل کند.

تأثیر رباتیک در جامعه 

علم رباتیک در اصل در صنعت به‌کار می‌رود و ما تأثیر آن را در محصولاتی که هر روزه استفاده می‌کنیم، می‌بینیم. که این تأثیرات معمولاً در محصولات ارزان‌تر دیده می‌‌شود.

ربات‌ها معمولاً در مواردی استفاده می‌شوند که بتوانند کاری را بهتر از یک انسان انجام دهند یا در محیط پر خطر فعالیت نمایند مثل اکتشافات در مکان‌های خطرناک مانند آتش‌فشان‌ها که می‌توان بدون به خطر انداختن انسان‌ها انجام داد.

قوانین سه‌گانه رباتیک

ایزاک آسیموف نویسنده داستان‌های علمی تخیلی قوانین سه‌گانه رباتیک را به صورت زیر تعریف‌کرده است:
1ـ یک ربات نباید به هستی انسان آسیب برساند یا به واسطه بی‌تحرکی، زندگی یک انسان را به مخاطره بیاندازد.
2ـ یک ربات باید از دستوراتی که توسط انسان به او داده می‌شود، اطاعت کند؛ جز در مواردی که با قانون یکم در تضاد هستند.
3ـ یک ربات باید تا جایی‌که با قوانین یکم و سوم در تضاد نباشد از خود محافظت کند.

مشکلات رباتیک

یک ربات مانند هر ماشین دیگری، می‌تواند بشکند یا به هر علتی خراب شود. ضمناً آن‌ها ماشین‌های قدرتمندی هستند که به ما اجازه می‌دهند کارهای معینی را کنترل کنیم.

خوشبختانه خرابی ربات‌ها بسیار نادر است زیرا سیستم رباتیک با مشخصه‌های امنیتی زیادی طراحی می‌شود که می‌تواند آسیب‌ آن‌ها را محدود ‌کند.

در این حوزه نیز مشکلاتی در رابطه با انسان‌های شرور و استفاده از ربات‌ها برای مقاصد شیطانی داریم. مطمئناً ربات‌ها می‌توانند در جنگ‌های آینده استفاده شوند. این می‌تواند هم خوب و هم بد باشد. اگر انسان‌ها اعمال خشونت آمیز را با فرستادن ماشین‌ها به جنگ یکدیگر نمایش دهند، ممکن است بهتر از فرستادن انسان‌ها به جنگ با یکدیگر باشد. ربات‌ها می‌توانند برای دفاع از یک کشور در مقابل حملات استفاده می‌شوند تا تلفات انسانی را کاهش دهد. آیا جنگ‌های آینده می‌تواند فقط یک بازی ویدئویی باشد که ربات‌ها را کنترل می‌کند؟

مزایای رباتیک

معمولاً یک ربات می‌تواند کارهایی که ما انسان‌ها می‌خواهیم انجام دهیم را ارزان‌تر انجام‌ دهد. ربات‌ها می‌توانند کارها را دقیقتر از انسان‌ها انجام دهند و روند پیشرفت در علم پزشکی و سایر علوم کاربردی را سرعت ‌بخشند. ربات‌ها به ویژه در امور تکراری و خسته کننده مانند ساختن صفحه مدار، ریختن چسب روی قطعات یدکی و… سودمند هستند. برای مثال امروزه برای بررسی وضعیت داخلی رآکتورها از ربات استفاده می شود تا تشعشعات رادیواکتیو به انسانها صدمه نزند. رباتها روز به روز هوشمندتر می شوند تا هرچه بیشتر در کارهای سخت و پر خطر به یاری انسانها بیایند.

 

رباتیک چیست

نرم افزارهای حوزه ی رباتیک

RobotWorks :  این نرم افزار میتواند واسط رباتیک و گذرگاه شبیه سازی ربات را برای نرم افزار محبوب SolidWorks ایجاد نماید. با استفاده از RobotWorks قادر خواهید بود ربات های صنعتی خود را در نرم افزار SolidWorks طراحی کرده و حرکات و اطلاعات مربوط به آنها را به صورت سه بعدی ( در نرم افزار RobotWorks ) مشاهده نمایید .

EASY-ROB : EASY-ROB  یک نرم افزار کاربردی در زمینه ی شبیه سازی بازو های رباتیک است که کاربران با استفاده از آن میتوانند ضمن مشاهده ی رفتار دقیق بازو، اطلاعات مربوط به ساخت آن را نیز از نرم افزار استخراج نمایید.

RoboCupRescue : وجود بلایای طبعیی همچون سیل، زلزله و… و خرابی هایی که بعد از رخ دادن آنها دامن گیر انسان ها میشود باعث شد، تا بشر به کاربرد ربات ها در زمینه ی امداد و نجات توجه بیشتر داشته باشد، در این بین گروه های مختلفی در زمینه ی طراحی و ساخت ربات های امداد گر شروع به فعالیت کردند یکی از این گروه ها تیم تحقیقاتی RoboCupRescue میباشد.

Microsoft Robotics Developer Studio : این نرم افزار یکی از نرم افزارهای قوی در زمینه شبیه سازی ربات ها است.شما با استفاده از این نرم افزار، می توانید به راحتی بخش مکانیک ربات خود را شبیه سازی نمایید.

Webots : نرم افزار Webots برای مدلسازی و برنامه نویسی و شبیه سازی ربات های متحرک مورد استفاده قرار می گیرد.کتابخانه های این محصول، به شما امکان می دهد که برنامه های کنترلی خودتان را به منظور ساخت ربات های واقعی بر روی این ربات ها به اجرا در بیاورید. همچنین خود نرم افزار هم این امکان رو به شما می دهد که ربات های مختلفی را در یک محیط طراحی کنید و برای هر کدام می توانید ویژگی های متفاوتی را تعریف کنید، همانند، شکل، رنگ، تکسچر، جرم، اصطکاک و غیره. همچنین شما می توانید هر ربات را با تعداد زیادی از سنسورها و محرک ها مجهز کنید. شما قادر خواهید بود که برای آنها برنامه نویسی کنید و نتایج را بر روی ربات های واقعی پیاده کنید. بیش از 5000 دانشگاه و مرکز تحقیقاتی از این نرم افزار استفاده می کنند.

تاثیرات شغلی رباتیک

بسیاری از مردم از اینکه ربات‌ها تعداد شغل‌ها را کاهش دهد و افراد زیادی شغل خود را از دست دهند، نگرانند. این تقریباً هرگز قضیه‌ای بر خلاف تکنولوژی جدید نیست. در حقیقت اثر پیشرفت‌ تکنولوژی مانند ربات‌ها (اتومبیل و دستگاه کپی و…) بر جوامع ، آن است که انسان بهره‌ورتر می‌شود.

آینده رباتیک

جمعیت ربات‌ها به سرعت در حال افزایش است. این رشد توسط ژاپنی‌ها که ربات‌های آن‌ها تقریباً دو برابر تعداد ربات‌های آمریکا است، هدایت شده است.
همه ارزیابی‌ها بر این نکته تأکید دارد که ربات‌ها نقش فزاینده‌ای در جوامع مدرن ایفا خواهند کرد. آن ها به انجام کارهای خطرناک، تکراری، پر هزینه و دقیق ادامه می‌دهند تا انسان‌ها را از انجام آن‌ها باز دارند.

منبع

 


منابع

1.fa.wikipedia.org

2. www.enline.ir

3.http://rasekhoon.net

4.http://mediasoft.ir

رباتیک چیست؟ قسمت 1
رباتیک چیست؟ قسمت 2

مارس 22, 2020/0 دیدگاه /توسط hgadmin
https://behsanandish.com/wp-content/uploads/2019/08/RPA-April-2014-2-1.jpg 256 256 hgadmin https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png hgadmin2020-03-22 10:00:072020-03-22 10:00:07رباتیک چیست؟ قسمت 2

الگوریتم Canny در سی پلاس پلاس قسمت 2

پروژه ها و سورس کدهای پردازش تصویر و بینایی ماشین

مرحله 2: پیدا کردن قدرت و جهت گرادیان لبه.

گام بعدی استفاده از Mask های Sobel برای پیدا کردن قدرت و جهت گرادیان لبه برای هر پیکسل است. ابتدا ماسک های Sobel به محدوده پیکسل 3×3 پیکسل فعلی در هر دو جهت x و y اعمال می شود. سپس مجموع مقدار هر ماسک ضربدر پیکسل مربوطه به ترتیب به عنوان مقادیر Gx و Gy محاسبه می شود. ریشه دوم مربع Gx به اضافه Gy مربع برابر قدرت لبه است. Tangent معکوس Gx / Gy جهت لبه را تولید می کند. سپس جهت لبه تقریب شده است به یکی از چهار مقادیر ممکن که ایجاد می کند جهت های ممکن را که  یک لبه می تواند در یک تصویر از یک شبکه پیکسل مربع باشد. این جهت لبه در edgeDir [row] [col] ذخیره می شود و قدرت گرادیان در  array gradient[row] [col] ذخیره می شود.

 

CannyEdgeWeel

هر زاویه لبه در 11.25 درجه از یکی از  زاویه های ممکن به آن مقدار تغییر می کند.

 

#include "stdafx.h"
#include "tripod.h"
#include "tripodDlg.h"

#include "LVServerDefs.h"
#include "math.h"
#include <fstream>
#include <string>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>


#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

using namespace std;

/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTripodDlg dialog

CTripodDlg::CTripodDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTripodDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTripodDlg)
		// NOTE: the ClassWizard will add member initialization here
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	//////////////// Set destination BMP to NULL first 
	m_destinationBitmapInfoHeader = NULL;

}

////////////////////// Additional generic functions

static unsigned PixelBytes(int w, int bpp)
{
    return (w * bpp + 7) / 8;
}

static unsigned DibRowSize(int w, int bpp)
{
    return (w * bpp + 31) / 32 * 4;
}

static unsigned DibRowSize(LPBITMAPINFOHEADER pbi)
{
    return DibRowSize(pbi->biWidth, pbi->biBitCount);
}

static unsigned DibRowPadding(int w, int bpp)
{
    return DibRowSize(w, bpp) - PixelBytes(w, bpp);
}

static unsigned DibRowPadding(LPBITMAPINFOHEADER pbi)
{
    return DibRowPadding(pbi->biWidth, pbi->biBitCount);
}

static unsigned DibImageSize(int w, int h, int bpp)
{
    return h * DibRowSize(w, bpp);
}

static size_t DibSize(int w, int h, int bpp)
{
    return sizeof (BITMAPINFOHEADER) + DibImageSize(w, h, bpp);
}

/////////////////////// end of generic functions


void CTripodDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTripodDlg)
	DDX_Control(pDX, IDC_PROCESSEDVIEW, m_cVideoProcessedView);
	DDX_Control(pDX, IDC_UNPROCESSEDVIEW, m_cVideoUnprocessedView);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTripodDlg, CDialog)
	//{{AFX_MSG_MAP(CTripodDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDEXIT, OnExit)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTripodDlg message handlers

BOOL CTripodDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		CString strAboutMenu;
		strAboutMenu.LoadString(IDS_ABOUTBOX);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here

	// For Unprocessed view videoportal (top one)
	char sRegUnprocessedView[] = "HKEY_LOCAL_MACHINE\\Software\\UnprocessedView";
	m_cVideoUnprocessedView.PrepareControl("UnprocessedView", sRegUnprocessedView, 0 );	
	m_cVideoUnprocessedView.EnableUIElements(UIELEMENT_STATUSBAR,0,TRUE);
	m_cVideoUnprocessedView.ConnectCamera2();
	m_cVideoUnprocessedView.SetEnablePreview(TRUE);

	// For binary view videoportal (bottom one)
	char sRegProcessedView[] = "HKEY_LOCAL_MACHINE\\Software\\ProcessedView";
	m_cVideoProcessedView.PrepareControl("ProcessedView", sRegProcessedView, 0 );	
	m_cVideoProcessedView.EnableUIElements(UIELEMENT_STATUSBAR,0,TRUE);
	m_cVideoProcessedView.ConnectCamera2();
	m_cVideoProcessedView.SetEnablePreview(TRUE);

	// Initialize the size of binary videoportal
	m_cVideoProcessedView.SetPreviewMaxHeight(240);
	m_cVideoProcessedView.SetPreviewMaxWidth(320);

	// Uncomment if you wish to fix the live videoportal's size
	// m_cVideoUnprocessedView.SetPreviewMaxHeight(240);
	// m_cVideoUnprocessedView.SetPreviewMaxWidth(320);

	// Find the screen coodinates of the binary videoportal
	m_cVideoProcessedView.GetWindowRect(m_rectForProcessedView);
	ScreenToClient(m_rectForProcessedView);
	allocateDib(CSize(320, 240));

	// Start grabbing frame data for Procssed videoportal (bottom one)
	m_cVideoProcessedView.StartVideoHook(0);

	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTripodDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CTripodDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CTripodDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CTripodDlg::OnExit() 
{
	// TODO: Add your control notification handler code here

	// Kill live view videoportal (top one)
	m_cVideoUnprocessedView.StopVideoHook(0);
    m_cVideoUnprocessedView.DisconnectCamera();	
	
	// Kill binary view videoportal (bottom one)
	m_cVideoProcessedView.StopVideoHook(0);
    m_cVideoProcessedView.DisconnectCamera();	

	// Kill program
	DestroyWindow();	

	

}

BEGIN_EVENTSINK_MAP(CTripodDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CTripodDlg)
	ON_EVENT(CTripodDlg, IDC_PROCESSEDVIEW, 1 /* PortalNotification */, OnPortalNotificationProcessedview, VTS_I4 VTS_I4 VTS_I4 VTS_I4)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CTripodDlg::OnPortalNotificationProcessedview(long lMsg, long lParam1, long lParam2, long lParam3) 
{
	// TODO: Add your control notification handler code here
	
	// This function is called at the camera's frame rate
    
#define NOTIFICATIONMSG_VIDEOHOOK	10

	// Declare some useful variables
	// QCSDKMFC.pdf (Quickcam MFC documentation) p. 103 explains the variables lParam1, lParam2, lParam3 too 
	
	LPBITMAPINFOHEADER lpBitmapInfoHeader; // Frame's info header contains info like width and height
	LPBYTE lpBitmapPixelData; // This pointer-to-long will point to the start of the frame's pixel data
    unsigned long lTimeStamp; // Time when frame was grabbed

	switch(lMsg) {
		case NOTIFICATIONMSG_VIDEOHOOK:
			{
				lpBitmapInfoHeader = (LPBITMAPINFOHEADER) lParam1; 
				lpBitmapPixelData = (LPBYTE) lParam2;
				lTimeStamp = (unsigned long) lParam3;

				grayScaleTheFrameData(lpBitmapInfoHeader, lpBitmapPixelData);
				doMyImageProcessing(lpBitmapInfoHeader); // Place where you'd add your image processing code
				displayMyResults(lpBitmapInfoHeader);

			}
			break;

		default:
			break;
	}	
}

void CTripodDlg::allocateDib(CSize sz)
{
	// Purpose: allocate information for a device independent bitmap (DIB)
	// Called from OnInitVideo

	if(m_destinationBitmapInfoHeader) {
		free(m_destinationBitmapInfoHeader);
		m_destinationBitmapInfoHeader = NULL;
	}

	if(sz.cx | sz.cy) {
		m_destinationBitmapInfoHeader = (LPBITMAPINFOHEADER)malloc(DibSize(sz.cx, sz.cy, 24));
		ASSERT(m_destinationBitmapInfoHeader);
		m_destinationBitmapInfoHeader->biSize = sizeof(BITMAPINFOHEADER);
		m_destinationBitmapInfoHeader->biWidth = sz.cx;
		m_destinationBitmapInfoHeader->biHeight = sz.cy;
		m_destinationBitmapInfoHeader->biPlanes = 1;
		m_destinationBitmapInfoHeader->biBitCount = 24;
		m_destinationBitmapInfoHeader->biCompression = 0;
		m_destinationBitmapInfoHeader->biSizeImage = DibImageSize(sz.cx, sz.cy, 24);
		m_destinationBitmapInfoHeader->biXPelsPerMeter = 0;
		m_destinationBitmapInfoHeader->biYPelsPerMeter = 0;
		m_destinationBitmapInfoHeader->biClrImportant = 0;
		m_destinationBitmapInfoHeader->biClrUsed = 0;
	}
}

void CTripodDlg::displayMyResults(LPBITMAPINFOHEADER lpThisBitmapInfoHeader)
{
	// displayMyResults: Displays results of doMyImageProcessing() in the videoport
	// Notes: StretchDIBits stretches a device-independent bitmap to the appropriate size

	CDC				*pDC;	// Device context to display bitmap data
	
	pDC = GetDC();	
	int nOldMode = SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);

	StretchDIBits( 
		pDC->GetSafeHdc(),
		m_rectForProcessedView.left,				// videoportal left-most coordinate
		m_rectForProcessedView.top,					// videoportal top-most coordinate
		m_rectForProcessedView.Width(),				// videoportal width
		m_rectForProcessedView.Height(),			// videoportal height
		0,											// Row position to display bitmap in videoportal
		0,											// Col position to display bitmap in videoportal
		lpThisBitmapInfoHeader->biWidth,			// m_destinationBmp's number of columns
		lpThisBitmapInfoHeader->biHeight,			// m_destinationBmp's number of rows
		m_destinationBmp,							// The bitmap to display; use the one resulting from doMyImageProcessing
		(BITMAPINFO*)m_destinationBitmapInfoHeader, // The bitmap's header info e.g. width, height, number of bits etc
		DIB_RGB_COLORS,								// Use default 24-bit color table
		SRCCOPY										// Just display
	);
 
	SetStretchBltMode(pDC->GetSafeHdc(),nOldMode);

	ReleaseDC(pDC);

	// Note: 04/24/02 - Added the following:
	// Christopher Wagner cwagner@fas.harvard.edu noticed that memory wasn't being freed

	// Recall OnPortalNotificationProcessedview, which gets called everytime
	// a frame of data arrives, performs 3 steps:
	// (1) grayScaleTheFrameData - which mallocs m_destinationBmp
	// (2) doMyImageProcesing
	// (3) displayMyResults - which we're in now
	// Since we're finished with the memory we malloc'ed for m_destinationBmp
	// we should free it: 
	
	free(m_destinationBmp);

	// End of adds
}

void CTripodDlg::grayScaleTheFrameData(LPBITMAPINFOHEADER lpThisBitmapInfoHeader, LPBYTE lpThisBitmapPixelData)
{

	// grayScaleTheFrameData: Called by CTripodDlg::OnPortalNotificationBinaryview
	// Task: Read current frame pixel data and computes a grayscale version

	unsigned int	W, H;			  // Width and Height of current frame [pixels]
	BYTE            *sourceBmp;		  // Pointer to current frame of data
	unsigned int    row, col;
	unsigned long   i;
	BYTE			grayValue;

	BYTE			redValue;
	BYTE			greenValue;
	BYTE			blueValue;

    W = lpThisBitmapInfoHeader->biWidth;  // biWidth: number of columns
    H = lpThisBitmapInfoHeader->biHeight; // biHeight: number of rows

	// Store pixel data in row-column vector format
	// Recall that each pixel requires 3 bytes (red, blue and green bytes)
	// m_destinationBmp is a protected member and declared in binarizeDlg.h

	m_destinationBmp = (BYTE*)malloc(H*3*W*sizeof(BYTE));

	// Point to the current frame's pixel data
	sourceBmp = lpThisBitmapPixelData;

	for (row = 0; row < H; row++) {
		for (col = 0; col < W; col++) {

			// Recall each pixel is composed of 3 bytes
			i = (unsigned long)(row*3*W + 3*col);
        
			// The source pixel has a blue, green andred value:
			blueValue  = *(sourceBmp + i);
			greenValue = *(sourceBmp + i + 1);
			redValue   = *(sourceBmp + i + 2);

			// A standard equation for computing a grayscale value based on RGB values
			grayValue = (BYTE)(0.299*redValue + 0.587*greenValue + 0.114*blueValue);

			// The destination BMP will be a grayscale version of the source BMP
			*(m_destinationBmp + i)     = grayValue;
			*(m_destinationBmp + i + 1) = grayValue;
			*(m_destinationBmp + i + 2) = grayValue;
			
		}
	}
}


void CTripodDlg::doMyImageProcessing(LPBITMAPINFOHEADER lpThisBitmapInfoHeader)
{
	// doMyImageProcessing:  This is where you'd write your own image processing code
	// Task: Read a pixel's grayscale value and process accordingly

	unsigned int	W, H;			// Width and Height of current frame [pixels]
	unsigned int    row, col;		// Pixel's row and col positions
	unsigned long   i;				// Dummy variable for row-column vector
	int	    upperThreshold = 60;	// Gradient strength nessicary to start edge
	int		lowerThreshold = 30;	// Minimum gradient strength to continue edge
	unsigned long iOffset;			// Variable to offset row-column vector during sobel mask
	int rowOffset;					// Row offset from the current pixel
	int colOffset;					// Col offset from the current pixel
	int rowTotal = 0;				// Row position of offset pixel
	int colTotal = 0;				// Col position of offset pixel
	int Gx;							// Sum of Sobel mask products values in the x direction
	int Gy;							// Sum of Sobel mask products values in the y direction
	float thisAngle;				// Gradient direction based on Gx and Gy
	int newAngle;					// Approximation of the gradient direction
	bool edgeEnd;					// Stores whether or not the edge is at the edge of the possible image
	int GxMask[3][3];				// Sobel mask in the x direction
	int GyMask[3][3];				// Sobel mask in the y direction
	int newPixel;					// Sum pixel values for gaussian
	int gaussianMask[5][5];			// Gaussian mask

	W = lpThisBitmapInfoHeader->biWidth;  // biWidth: number of columns
    H = lpThisBitmapInfoHeader->biHeight; // biHeight: number of rows
	
	for (row = 0; row < H; row++) {
		for (col = 0; col < W; col++) {
			edgeDir[row][col] = 0;
		}
	}

	/* Declare Sobel masks */
	GxMask[0][0] = -1; GxMask[0][1] = 0; GxMask[0][2] = 1;
	GxMask[1][0] = -2; GxMask[1][1] = 0; GxMask[1][2] = 2;
	GxMask[2][0] = -1; GxMask[2][1] = 0; GxMask[2][2] = 1;
	
	GyMask[0][0] =  1; GyMask[0][1] =  2; GyMask[0][2] =  1;
	GyMask[1][0] =  0; GyMask[1][1] =  0; GyMask[1][2] =  0;
	GyMask[2][0] = -1; GyMask[2][1] = -2; GyMask[2][2] = -1;

	/* Declare Gaussian mask */
	gaussianMask[0][0] = 2;		gaussianMask[0][1] = 4;		gaussianMask[0][2] = 5;		gaussianMask[0][3] = 4;		gaussianMask[0][4] = 2;	
	gaussianMask[1][0] = 4;		gaussianMask[1][1] = 9;		gaussianMask[1][2] = 12;	gaussianMask[1][3] = 9;		gaussianMask[1][4] = 4;	
	gaussianMask[2][0] = 5;		gaussianMask[2][1] = 12;	gaussianMask[2][2] = 15;	gaussianMask[2][3] = 12;	gaussianMask[2][4] = 2;	
	gaussianMask[3][0] = 4;		gaussianMask[3][1] = 9;		gaussianMask[3][2] = 12;	gaussianMask[3][3] = 9;		gaussianMask[3][4] = 4;	
	gaussianMask[4][0] = 2;		gaussianMask[4][1] = 4;		gaussianMask[4][2] = 5;		gaussianMask[4][3] = 4;		gaussianMask[4][4] = 2;	
	

	/* Gaussian Blur */
	for (row = 2; row < H-2; row++) {
		for (col = 2; col < W-2; col++) {
			newPixel = 0;
			for (rowOffset=-2; rowOffset<=2; rowOffset++) {
				for (colOffset=-2; colOffset<=2; colOffset++) {
					rowTotal = row + rowOffset;
					colTotal = col + colOffset;
					iOffset = (unsigned long)(rowTotal*3*W + colTotal*3);
					newPixel += (*(m_destinationBmp + iOffset)) * gaussianMask[2 + rowOffset][2 + colOffset];
				}
			}
			i = (unsigned long)(row*3*W + col*3);
			*(m_destinationBmp + i) = newPixel / 159;
		}
	}

	/* Determine edge directions and gradient strengths */
	for (row = 1; row < H-1; row++) {
		for (col = 1; col < W-1; col++) {
			i = (unsigned long)(row*3*W + 3*col);
			Gx = 0;
			Gy = 0;
			/* Calculate the sum of the Sobel mask times the nine surrounding pixels in the x and y direction */
			for (rowOffset=-1; rowOffset<=1; rowOffset++) {
				for (colOffset=-1; colOffset<=1; colOffset++) {
					rowTotal = row + rowOffset;
					colTotal = col + colOffset;
					iOffset = (unsigned long)(rowTotal*3*W + colTotal*3);
					Gx = Gx + (*(m_destinationBmp + iOffset) * GxMask[rowOffset + 1][colOffset + 1]);
					Gy = Gy + (*(m_destinationBmp + iOffset) * GyMask[rowOffset + 1][colOffset + 1]);
				}
			}

			gradient[row][col] = sqrt(pow(Gx,2.0) + pow(Gy,2.0));	// Calculate gradient strength			
			thisAngle = (atan2(Gx,Gy)/3.14159) * 180.0;		// Calculate actual direction of edge
			
			/* Convert actual edge direction to approximate value */
			if ( ( (thisAngle < 22.5) && (thisAngle > -22.5) ) || (thisAngle > 157.5) || (thisAngle < -157.5) )
				newAngle = 0;
			if ( ( (thisAngle > 22.5) && (thisAngle < 67.5) ) || ( (thisAngle < -112.5) && (thisAngle > -157.5) ) )
				newAngle = 45;
			if ( ( (thisAngle > 67.5) && (thisAngle < 112.5) ) || ( (thisAngle < -67.5) && (thisAngle > -112.5) ) )
				newAngle = 90;
			if ( ( (thisAngle > 112.5) && (thisAngle < 157.5) ) || ( (thisAngle < -22.5) && (thisAngle > -67.5) ) )
				newAngle = 135;
				
			edgeDir[row][col] = newAngle;		// Store the approximate edge direction of each pixel in one array
		}
	}

	/* Trace along all the edges in the image */
	for (row = 1; row < H - 1; row++) {
		for (col = 1; col < W - 1; col++) {
			edgeEnd = false;
			if (gradient[row][col] > upperThreshold) {		// Check to see if current pixel has a high enough gradient strength to be part of an edge
				/* Switch based on current pixel's edge direction */
				switch (edgeDir[row][col]){		
					case 0:
						findEdge(0, 1, row, col, 0, lowerThreshold);
						break;
					case 45:
						findEdge(1, 1, row, col, 45, lowerThreshold);
						break;
					case 90:
						findEdge(1, 0, row, col, 90, lowerThreshold);
						break;
					case 135:
						findEdge(1, -1, row, col, 135, lowerThreshold);
						break;
					default :
						i = (unsigned long)(row*3*W + 3*col);
						*(m_destinationBmp + i) = 
						*(m_destinationBmp + i + 1) = 
						*(m_destinationBmp + i + 2) = 0;
						break;
					}
				}
			else {
				i = (unsigned long)(row*3*W + 3*col);
					*(m_destinationBmp + i) = 
					*(m_destinationBmp + i + 1) = 
					*(m_destinationBmp + i + 2) = 0;
			}	
		}
	}
	
	/* Suppress any pixels not changed by the edge tracing */
	for (row = 0; row < H; row++) {
		for (col = 0; col < W; col++) {	
			// Recall each pixel is composed of 3 bytes
			i = (unsigned long)(row*3*W + 3*col);
			// If a pixel's grayValue is not black or white make it black
			if( ((*(m_destinationBmp + i) != 255) && (*(m_destinationBmp + i) != 0)) || ((*(m_destinationBmp + i + 1) != 255) && (*(m_destinationBmp + i + 1) != 0)) || ((*(m_destinationBmp + i + 2) != 255) && (*(m_destinationBmp + i + 2) != 0)) ) 
				*(m_destinationBmp + i) = 
				*(m_destinationBmp + i + 1) = 
				*(m_destinationBmp + i + 2) = 0; // Make pixel black
		}
	}

	/* Non-maximum Suppression */
	for (row = 1; row < H - 1; row++) {
		for (col = 1; col < W - 1; col++) {
			i = (unsigned long)(row*3*W + 3*col);
			if (*(m_destinationBmp + i) == 255) {		// Check to see if current pixel is an edge
				/* Switch based on current pixel's edge direction */
				switch (edgeDir[row][col]) {		
					case 0:
						suppressNonMax( 1, 0, row, col, 0, lowerThreshold);
						break;
					case 45:
						suppressNonMax( 1, -1, row, col, 45, lowerThreshold);
						break;
					case 90:
						suppressNonMax( 0, 1, row, col, 90, lowerThreshold);
						break;
					case 135:
						suppressNonMax( 1, 1, row, col, 135, lowerThreshold);
						break;
					default :
						break;
				}
			}	
		}
	}
	
}

void CTripodDlg::findEdge(int rowShift, int colShift, int row, int col, int dir, int lowerThreshold)
{
	int W = 320;
	int H = 240;
	int newRow;
	int newCol;
	unsigned long i;
	bool edgeEnd = false;

	/* Find the row and column values for the next possible pixel on the edge */
	if (colShift < 0) {
		if (col > 0)
			newCol = col + colShift;
		else
			edgeEnd = true;
	} else if (col < W - 1) {
		newCol = col + colShift;
	} else
		edgeEnd = true;		// If the next pixel would be off image, don't do the while loop
	if (rowShift < 0) {
		if (row > 0)
			newRow = row + rowShift;
		else
			edgeEnd = true;
	} else if (row < H - 1) {
		newRow = row + rowShift;
	} else
		edgeEnd = true;	
		
	/* Determine edge directions and gradient strengths */
	while ( (edgeDir[newRow][newCol]==dir) && !edgeEnd && (gradient[newRow][newCol] > lowerThreshold) ) {
		/* Set the new pixel as white to show it is an edge */
		i = (unsigned long)(newRow*3*W + 3*newCol);
		*(m_destinationBmp + i) =
		*(m_destinationBmp + i + 1) =
		*(m_destinationBmp + i + 2) = 255;
		if (colShift < 0) {
			if (newCol > 0)
				newCol = newCol + colShift;
			else
				edgeEnd = true;	
		} else if (newCol < W - 1) {
			newCol = newCol + colShift;
		} else
			edgeEnd = true;	
		if (rowShift < 0) {
			if (newRow > 0)
				newRow = newRow + rowShift;
			else
				edgeEnd = true;
		} else if (newRow < H - 1) {
			newRow = newRow + rowShift;
		} else
			edgeEnd = true;	
	}	
}

void CTripodDlg::suppressNonMax(int rowShift, int colShift, int row, int col, int dir, int lowerThreshold)
{
	int W = 320;
	int H = 240;
	int newRow = 0;
	int newCol = 0;
	unsigned long i;
	bool edgeEnd = false;
	float nonMax[320][3];			// Temporarily stores gradients and positions of pixels in parallel edges
	int pixelCount = 0;					// Stores the number of pixels in parallel edges
	int count;						// A for loop counter
	int max[3];						// Maximum point in a wide edge
	
	if (colShift < 0) {
		if (col > 0)
			newCol = col + colShift;
		else
			edgeEnd = true;
	} else if (col < W - 1) {
		newCol = col + colShift;
	} else
		edgeEnd = true;		// If the next pixel would be off image, don't do the while loop
	if (rowShift < 0) {
		if (row > 0)
			newRow = row + rowShift;
		else
			edgeEnd = true;
	} else if (row < H - 1) {
		newRow = row + rowShift;
	} else
		edgeEnd = true;	
	i = (unsigned long)(newRow*3*W + 3*newCol);
	/* Find non-maximum parallel edges tracing up */
	while ((edgeDir[newRow][newCol] == dir) && !edgeEnd && (*(m_destinationBmp + i) == 255)) {
		if (colShift < 0) {
			if (newCol > 0)
				newCol = newCol + colShift;
			else
				edgeEnd = true;	
		} else if (newCol < W - 1) {
			newCol = newCol + colShift;
		} else
			edgeEnd = true;	
		if (rowShift < 0) {
			if (newRow > 0)
				newRow = newRow + rowShift;
			else
				edgeEnd = true;
		} else if (newRow < H - 1) {
			newRow = newRow + rowShift;
		} else
			edgeEnd = true;	
		nonMax[pixelCount][0] = newRow;
		nonMax[pixelCount][1] = newCol;
		nonMax[pixelCount][2] = gradient[newRow][newCol];
		pixelCount++;
		i = (unsigned long)(newRow*3*W + 3*newCol);
	}

	/* Find non-maximum parallel edges tracing down */
	edgeEnd = false;
	colShift *= -1;
	rowShift *= -1;
	if (colShift < 0) {
		if (col > 0)
			newCol = col + colShift;
		else
			edgeEnd = true;
	} else if (col < W - 1) {
		newCol = col + colShift;
	} else
		edgeEnd = true;	
	if (rowShift < 0) {
		if (row > 0)
			newRow = row + rowShift;
		else
			edgeEnd = true;
	} else if (row < H - 1) {
		newRow = row + rowShift;
	} else
		edgeEnd = true;	
	i = (unsigned long)(newRow*3*W + 3*newCol);
	while ((edgeDir[newRow][newCol] == dir) && !edgeEnd && (*(m_destinationBmp + i) == 255)) {
		if (colShift < 0) {
			if (newCol > 0)
				newCol = newCol + colShift;
			else
				edgeEnd = true;	
		} else if (newCol < W - 1) {
			newCol = newCol + colShift;
		} else
			edgeEnd = true;	
		if (rowShift < 0) {
			if (newRow > 0)
				newRow = newRow + rowShift;
			else
				edgeEnd = true;
		} else if (newRow < H - 1) {
			newRow = newRow + rowShift;
		} else
			edgeEnd = true;	
		nonMax[pixelCount][0] = newRow;
		nonMax[pixelCount][1] = newCol;
		nonMax[pixelCount][2] = gradient[newRow][newCol];
		pixelCount++;
		i = (unsigned long)(newRow*3*W + 3*newCol);
	}

	/* Suppress non-maximum edges */
	max[0] = 0;
	max[1] = 0;
	max[2] = 0;
	for (count = 0; count < pixelCount; count++) {
		if (nonMax[count][2] > max[2]) {
			max[0] = nonMax[count][0];
			max[1] = nonMax[count][1];
			max[2] = nonMax[count][2];
		}
	}
	for (count = 0; count < pixelCount; count++) {
		i = (unsigned long)(nonMax[count][0]*3*W + 3*nonMax[count][1]);
		*(m_destinationBmp + i) = 
		*(m_destinationBmp + i + 1) = 
		*(m_destinationBmp + i + 2) = 0;
	}
}

الگوریتم Canny در سی پلاس پلاس قسمت 1
الگوریتم Canny در سی پلاس پلاس قسمت 2
الگوریتم Canny در سی پلاس پلاس قسمت 3
الگوریتم Canny در سی پلاس پلاس قسمت 4

مارس 18, 2020/0 دیدگاه /توسط hgadmin
https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png 0 0 hgadmin https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png hgadmin2020-03-18 10:00:332020-03-18 10:00:33الگوریتم Canny در سی پلاس پلاس قسمت 2

عامل های هوشمند قسمت 3

آموزش های عمومی هوش مصنوعی

عامل های هدف گرا

با مطالعه عامل هایی که خود را با محیط اطراف وقف میدهند، متوجه شدیم که آگاهی از تغییرات محیط یک امر حیاتی میباشد. اما آیا تنها آگاهی از تغییرات محیط برای آنکه بدانیم چه واکنشی را باید انجام داد کافی است؟ برای مثال فرض کنید که راننده هوشمند در جاده بر سر یک سه راهی رسیده است. مسئله ای که واضح است این است که راننده برای رسیدن به مقصد باید یکی از سه مسیر مستقیم، راست و یا چپ را انتخاب نماید. به زبان دیگر، علاوه بر آگاهی از تغییرات و وضعیت جاری محیط اطراف، باید اطلاعاتی در مورد هدف نهایی در اختیار عامل قرار گیرد.

عامل میتواند اطلاعات وضعیت جاری را با واکنش های انتخابی ممکن ترکیب کرده و از این دو به یک راه حل برای رسیدن به هدف خود برسد. گاهی اوقات این مسئله ساده میباشد و با انتخاب یک واکنش سریعا به هدف خواهیم رسید. گاهی نیز رسیدن به هدف پیچیده بوده و نمیتوان تنها با انتخاب یک واکنش به هدف رسید. در چنین مسائلی با توالی از واکنش ها که به هدف ختم میشوند روبرو خواهیم بود.

برای مثال فرض کنید که راننده هوشمند قصد دارد تا مسیری را از میان خیابان های تو در تو یک شهر بزرگ برای رسیدن به مقصد  انتخاب نماید. (Google Map یک مثال کاربردی آن میباشد) آیا این کار به سادگی انتخاب یک واکنش خواهد بود؟! نکته ی مهمی که باید به آن توجه داشت این است که در عامل های هدف گرا مکانیزم تصمیم گیری شباهتی به مکانیزم استراتژی واکنشی ساده ندارد. در این عامل ها باید همواره به این دو سوال جواب داد.

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

عامل های مبتنی بر سودمندی

گاهی اوقات تنها رسیدن به هدف نیست که در افزایش بازدهی عامل هوشمند موثر است. برای مثال فرض کنید میخواهیم از تهران به چالوس سفر کنیم. برای این سفر انتخاب های متعددی میتواند توسط راننده هوشمند انجام شود. اگر قرار باشد راننده هوشمند در محاسبات خود تنها به رسین به هدف توجه کند ممکن است در طول سفر خود از زاهدان عبور نماییم! دلیل این اتفاق کاملا واضح است. در این مسئله برای عامل هیچ اهمیتی ندارد که کدام مسیر را انتخاب نماید!

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

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

زمانی که اهداف متضاد داریم که هم زمان نمیتوان به تمام آنها دست یافت. برای مثال بحث سرعت رسیدن به مقصد و امنیت جانی مسافران
زمانی که عامل برای رسیدن به اهدافی تلاش میکند که هیچ کدام از قطعیت کامل برخوردار نیستند. که در اینجا عامل بحث اهمیت اهداف را دخالت خواهد داد.

منبع : http://retro-code.ir


ساختار عامل های هوشمند

کار AI طراحی برنامه ی عامل است که “تابع عامل” را پیاده سازی می کند. تابع عامل، ادراکات را به فعالیت ها نگاشت می کند. فرض میکنیم این برنامه بر روی یک دستگاه محاسباتی با حسگرها و محرک های فیزیکی، یعنی معماری اجرا می شود: برنامه + معماری = عامل

بدیهی است برنامه ای که انتخاب می کنیم باید با معماری تناسب داشته باشد. اگر برنامه بخواهد فعالیتی مثل راه رفتن را انجام دهد، معماری باید دارای پا باشد. معماری ممکن است یک pc معمولی، اتومبیل روباتیک با چند کامپیوتر، دوربین و سایر حسگر ها باشد. بطور کلی معماری، از طریق حسگرهای موجود درک می کند، برنامه را اجرا می کند، و انتخاب های فعالیت برنامه را به محرک ها ارسال می کند.

♦ برنامه های عامل  (agent programs)

برنامه های عامل درک فعلی را به عنوان ورودی از حسگرها (سنسورها) می پذیرند، و فعالیت را از طریق محرک ها انجام می دهند. توجه داشته باشید که ، برنامه عامل درک فعلی را به عنوان ورودی می گیرد، ولی تابع عامل کل سابقه درک را دریافت میکند. برنامه ی عامل، فقط درک فعلی را به عنوان ورودی می پذیرد، زیرا هیچ چیز دیگری از محیط در دسترس نیست. اگر فعالیت های عامل ، به کل “دنباله ی ادراک” بستگی داشته باشد، عامل باید کل ادراک ها را به یاد بیاورد.

برنامه  عامل، از طریق شبه کد ساده ای توصیف میشود. بعنوان مثال، شکل زیر یک برنامه عامل ساده را نشان میدهد که “دنباله ادراک” را ردیابی کرده از آن به عنوان شاخصی در جدول فعالیت ها استفاده می کند تا تصمیم بگیرد چه کاری باید انجام دهد. این جدول، تابع عاملی را صریحا نشان میدهد که در برنامه ی عامل گنجانده شده است. برای ساخت عامل خردمند، باید جدولی بسازیم که برای هر دنباله ی ادراک ممکن ، دارای فعالیت های مناسبی باشد.

function TABLE-DRIVEN-AGENT (percept) returns an action
  presistent: percepts, a sequence, initially empty table, a table of actions, indexed by percept sequences, initially fully specified
    
  append percept to end of percepts
  action  < - -  LOOKUP(percepts,table)
  return action
 

برای هر درک جدید فراخوانی می شود و هر بار فعالیتی را بر می گرداند. با استفاده از برنامه TABLE-DRIVEN-AGENT ساختمان داده های خود، دنباله ادراک را ردیابی می کند.
برنامه TABLE-DRIVEN-AGENT  تابع عامل مطلوب را پیاده سازی میکند. چالش مهم AI، چگونگی نوشتن برنامه ای است که با استفاده از یک کد کوچک (به جای جدول بزرگ)، رفتار عقلایی را انجام دهد. مثال های زیادی داریم که نشان می دهد، این کار امکان پذیر است. به عنوان مثال، جدول های بزرگ ریشه دوم که قبل از دهه 1970 توسط مهندسین و دانش آموزان مورد استفاده قرار گرفت، جای خود را به یک برنامه  5 خطی داده است که از روش نیوتن استفاده میکند و در ماشین حساب های الکترونیکی قابل استفاده است. AI همان کاری را انجام می دهد که نیوتن برای ریشه دوم انجام میدهد.

در ادامه، چهار نوع برنامه عامل را بررسی می کنیم که قواعد مربوط به تمام سیستم های هوشمند را دربر می گیرد. هر نوع برنامه ی عامل, اجزای خاصی را به روش های خاصی با هم ترکیب میکند تا فعالیت را  انجام دهد.

♦ عامل های واکنشی ساده (simple reflex agents)

ساده ترین نوع عامل ها، عامل واکنشی ساده است. این عامل ها فعالیت ها را بر اساس درک فعلی و بدون در نظر گرفتن سابقه ی ادراک، انتخاب میکنند. فرض کنید راننده ی تاکسی خودکار هستید. اگر اتومبیل جلویی ترمز کند و چراغ ترمز آن روشن شود، باید آن را تشخیص دهید و ترمز کنید. به عبارت دیگر ، برخی پردازش ها بر روی دریافت اطلاعات تصویر ورودی صورت می گیرد تا شرایطی که ما آن را “ترمزکردن اتومبیل جلویی” می نامیم رخ دهد، سپس این رویداد موجب فعال شدن برخی اتصالات موجود در برنامه عامل خواهد شد و عمل “اقدام به ترمز” را فعال می سازد. این اتصال را قانون شرط فعالیت یا قانون شرط کنش می نامیم: اگر اتومبیل جلویی ترمز کرد آنگاه اقدام به ترمز کن.

انسان نیز  چنین اتصالاتی دارد، که بعضی از آنها پاسخ های آموخته شده هستند (مثل رانندگی) و بعضی دیگر غریزی هستند (مثل بستن چشم هنگام نزدیک شدن شی ء ای به آن). روش کلی و قابل انعطاف این است که یک مفسر همه منظوره برای قوانین شرط فعالیت ساخته شود و سپس مجموعه ای از قوانین برای محیط های کار خاص ایجاد گردد. در شکل زیر، برنامه ی عامل نشان داده شده است که خیلی ساده است. تابع INTERPRET-INPUT با استفاده از ادراک، یک توصیف انتزاعی از حالت فعلی ایجاد میکند، و تابع RULE-MATCH اولین قانون موجود در مجموعه ای از قوانین را بر می گرداند که با توصیف حالت خاص مطابقت دارد:

function  SIMPLE-REFLEX-AGENT (percept) returns an action
  presistent: ruless, a set of condition-action rules
    
  state  <  - - INTEERPRET-INPUT (percept)
  rule  < - -  RULE-MATCH (state,rules)
  action  <  - -  rule.ACTION
  return action
 

عامل واکنشی ساده براساس قانونی عمل می کند که شرط آن با حالت فعلی که توسط ادراک تعریف شده است، تطبیق می کند.
“عامل های واکنشی ساده”، خواص ساده ولی هوش اندکی دارند. عامل تعریف شده در شکل بالا در صورتی کار میکند که تصمیم درستی براساس ادراک فعلی اتخاذ گردد. یعنی در صورتیکه محیط کاملا قابل مشاهده باشد. حتی عدم قابلیت مشاهده ی کوچک نیز ممکن است مشکلاتی را ایجاد کند.

اجتناب از حلقه های بی نهایت، در صورتی ممکن است که عامل بتواند فعالیت خود را تصادفی کند. در بعضی موارد، “عامل واکنشی ساده ی تصادفی” ممکن است مثل “عامل واکنشی ساده ی قطعی” عمل کند. رفتار تصادفی درست، در بعضی از محیط های چند عاملی میتواند عقلایی باشد. در محیط های تک عاملی، فعالیت تصادفی معمولا عقلایی نیست. این روش، در بعضی از وضعیت ها به عامل واکنشی ساده کمک می کند. اما در اغلب موارد، با استفاده از عامل های قطعی تخصصی، بهتر می توان عمل کرد.

♦ عامل های واکنشی مبتنی بر مدل (model-based reflex  agents)

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

تغییر این اطلاعات داخلی با مرور زمان، مستلزم دو نوع دانش است که باید در برنامه عامل کدنویسی شود. اولا باید بدانیم که دنیا چگونه مستقل از عامل تکامل می یابد. ثانیا، باید بدانیم که فعالیت های عامل، چه تاثیری در دنیا دارد. این دانش درباره ی “چگونگی عملکرد جهان” چه به صورت مدارهای منطقی ساده پیاده سازی شود یا به صورت تئوری های علمی، مدلی از دنیا نام دارد. عاملی که از چنین مدلی استفاده میکند، عامل مبتنی بر مدل نام دارد. برنامه عامل در شکل زیر نشان داده شده است. بخش جالب، تابع UPDATE-STATE است که مسئول ایجاد توصیف جدیدی از حالت داخلی است. جزئیات چگونگی نمایش مدل ها و حالت ها، به نوع محیط و فناوری استفاده شده در طراحی عامل بستگی دارد.

function  MODEL-BASED-REFLEX-AGENT (percept) returns an action
  presistent: state, the agent's current conception of the world state
              model, a description of how the next state depends on current state and action
              rules, a set of condition-action rules 
              action, the most recent action, initially none
  
  state  < -- UPDATE-STATE (state, action, peercept, model)
  rule  < -- RULE-MATCH (state,rules)
  action  < -- rule.ACTION
  return action
 

عامل واکنشی مبتنی بر مدل، حالت فعلی دنیا را با یک مدل داخلی ردیابی، و همانند عامل واکنشی ساده، فعالیتی را انتخاب میکند.

عامل های هوشمند قسمت 1
عامل های هوشمند قسمت 2
عامل های هوشمند قسمت 3
عامل های هوشمند قسمت 4
عامل های هوشمند قسمت 5

مارس 14, 2020/0 دیدگاه /توسط hgadmin
https://behsanandish.com/wp-content/uploads/2019/08/sensorseniv-300x129-Copy-1.png 256 256 hgadmin https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png hgadmin2020-03-14 10:00:152020-03-14 10:00:15عامل های هوشمند قسمت 3

آشنایی با #C قسمت 2

آموزش های زبان برنامه نویسی سی شارپ

ویژگی‌های جدید در سی شارپ  ۳٫۰

این ورژن از سی شارپ در تاریخ ۱۹ نوامبر سال ۲۰۰۷ به عنوان بخشی از چارچوب دات‌نت ۳٫۵ عرضه شد؛ که شامل ویژگی‌های جدید الهام شده از زبان‌های برنامه‌نویسی اصلی (Functional) مانند Haskell و ML، و الگوی LINQ برای CLR است. در حال حاضر توسط هیچ موسسه استانداردسازی تأیید نشده‌است.

معرفی لینک

لینک (به انگلیسی: Language Integrated Query)(مخفف انگلیسی: LINQ) یک زبان پرس و جوی قابل انعطاف و همه منظوره برای بسیاری از انواع منبع داده‌ها است (مثل انتخاب اشیاء شناور، سندهای XML، بانک‌های اطلاعاتی و…) که در ویژگی‌های سی شارپ ۳ جمع شده‌اند. سینتکس زبان به زحمت از SQL گرفته شده‌است، برای مثال:

int[] array = { 1, 5, 2, 10, 7 };

// Select squares of all odd numbers in the array sorted in descending order
IEnumerable<int> query = from x in array
                         where x % 2 == 1
                         orderby x descending
                         select x * x;

مقدار دهی به اشیاء

Customer c = new Customer(); c.Name = "James";

عبارت بالا می‌تواند به صورت زیر نوشته شود:

Customer c = new Customer { Name="James" };

مقدار دهی Collection

MyList list = new MyList();
list.Add(1);
list.Add(2);

عبارت بالا می‌تواند به صورت زیر نوشته شود:

MyList list = new MyList { 1, 2 };

فرض کنید که اجزای MyList و System.Collections.IEnumerable دارای متد عمومی Add هستند.

انواع داده‌ای بی نام

var x = new { FirstName="James", LastName="Frank" };

سی شارپ ۲٫۰ توابع بی نام را معرفی کرد. سی شارپ ۳٫۰ هم انواع بی نام را معرفی می‌کند. با استفاده از این ویژگی برنامه نویسان قادر خواهند بود به صورت Inline انواع دلخواه خود را ایجاد کنند. به نمونه زیر توجه کنید:

static void Main(string[] args)
{
    var anonymousType = new { Name = string.Empty, Age = 0 };
}

کد ارائه شده، یک نوع بی نام را تعریف می‌کند که از طریق متغیر ضمنی محلی به نام anonymousType در اختیار قرار می‌گیرد.

چرا Anonymous types؟ انواع بی نام بهترین گزینه برای تولید Entity Typeها می‌باشند. همان‌طور که گفته شد Entity Typeها فقط حاوی داده‌ها هستند؛ بنابراین به بهترین نحو می‌توان داده‌های دریافت شده از کاربر را در انواع بی نام بسته‌بندی کرد.

نتیجه نوع متغیر محلی

var x = new Dictionary < string, List < float >> ();

کد بالا با کد زیر قابل تعویض می‌باشد:

Dictionary < string, List < float >> x = new Dictionary < string, List < float >> ();

این ویژگی تنها یک ntactic sugarراحت برای کوتاه‌تر بیان کردن متغیرهای محلی نمی‌باشد، بلکه برای تعریف متغیرهای بی نام لازم نیز است.

عبارات لامبدا

عبارات لامبدا یک راه کوتاه برای نوشتن مقادیر توابع بی نام کلاس اول را فراهم می‌کنند. دو مثال زیر را در نظر بگیرید:

listOfFoo.Where(delegate(Foo x) { return x.Size > 10; })
listOfFoo.Where(x = > x.Size > 10);

در مثال‌های فوق، عبارات لامبدا صرفاً یک نوع سینتکس برای delegateهای بی نام با مقادیر دارای بازگشت هستند. هر چند با توجه به نوع متن استفاده می‌شوند، کامپایلر سی شارپ می‌تواند لامبداها را به ASTها نیز تبدیل کند تا بعداً در زمان اجرا نیز بتوانند پردازش شوند. در مثال فوق، اگر listOfFoo یک مجموعه ساده داخل حافظه نباشد، ولی یک پوشه در اطراف جدول بانک اطلاعاتیمی‌باشد. این تکنیک می‌تواند برای بهینه کردن اجرا، برای ترجمه بدنه لامبدا به عبارت معادل آن در SQL استفاده شود. در هر یک از دو راه فوق، خود عبارت لامبدا دقیقاً شبیه کد به نظر می‌رسد، بنابراین روش استفاده در زمان اجرا، برای کاربر ناپیدا می‌باشد.

یکی از ویژگی‌هایی که سی شارپ ۲٫۰ ارائه کرد، توانایی تعریف توابع به صورت Inline بود که این ویژگی با عنوان توابع بی نام (anonymous methods) شناخته می‌شود. توابع بی نام در پاره‌ای مواقع بسیار مفیدند. اما نحو(syntax) به‌کارگیری آن‌ها دشوار می‌باشد. عبارات لامبدا ویژگی توابع بی نام را دارند اما با نحو ساده‌تری در سی شارپ ۳٫۰ معرفی شده‌اند. به نمونه زیر توجه کنید:

static void Main(string[] args)
{
   (int x) = > x + 1;// explicitly typed parameter
   (y, z) = > y * z;// implicitly typed parameter
}

تعریف عبارات لامبدا از نحو (syntax) خاصی پیرو می‌کند. همان‌طور که در کد بالا مشاهده می‌کنید، پارامترهای تابع هم به صورت صریح و هم به صورت ضمنی قابل بیان‌اند. کلمه return به صورت ضمنی حذف شده‌است. تابع معادل عبارت لامبدای اول به صورت زیر است:

int Fn(int x)
{
    return x+1;
}

لیست پارامترها و بدنه عبارت لامبدا توسط => از هم جدا می‌شوند. در صورتی که تعریف عبارت لامبدا بیشتر از یک خط کد باشد می‌توان بدنه آن را با استفاده از {} نشان داد.

static void Main(string[] args)
{
    (int x) = > { x + 1; return x * x; };
}

خواص خودکار

کامپایلر به‌طور خودکار یک متغیر نمونه خصوصی و قرار دهنده و قرار گیرنده مناسب تولید می‌کند، مانند:

public string Name { get; private set; }

توابع بسط داده شده

توابع بسط داده شده حالتی از سینتکس Suger هستند که امکان اضافه کردن متد جدید به کلاس موجود را بیرون از حوزه تعریف آن فراهم می‌کنند. در این مثال، تابع بسط داده شده یک تابع ایستا است که قابل فراخوانی توسط تابع مشابه می‌باشد. گیرنده فراخوانی مقید به اولین پارامتر تابع تحت عنوان this می‌باشد:

public static class StringExtensions
{
    public static string Left(this string s, int n)
    {
        return s.Substring(0, n);
    }
}

string s = "foo";
s.Left(3);// same as StringExtensions.Left(s, 3);

زبان سی شارپ کلمه کلیدی sealed را برای این منظور ارائه کرد که امکان ارث بری از یک کلاس را صلب کند. یعنی با اضافه شدن این کلمه کلیدی به ابتدای تعریف کلاس، امکان ارث بری از آن غیرممکن می‌شود. سی شارپ ۳٫۰ ویژگی جدیدی را در اختیار برنامه نویسان قرار می‌دهد به این صورت که می‌توان هر نوع کلاسی حتی کلاس‌های مهر شده با Sealed را با استفاده از Extension methodsبسط داد.

توابع جزئی

توابع جزئی به تولیدکننده‌های کد اجازه تولید اعلان توابع به صورت نقاط گسترش یافته‌ای که تنها شامل کدهای اصلی هستند را می‌دهد، در صورتی که یک نفر آن را در قسمتی از کلاسی دیگر اجرا کند.

آرایه‌های نوع ضمنی

آرایه‌ها را نیز می‌توان با استفاده از کلمه کلیدی var تعریف کرد.

static void Main(string[] args)
{
    var a = new[] { 1, 10, 100, 1000 };// int[]
    var b = new[] { 1, "one", 2 };// Error
}

پیش پردازنده

ویژگی «دستورها پیش پردازنده» سی شارپ (اگرچه آن‌ها به واقع یک پیش پردازنده نیستند) مبنی بر دستورها پیش پردازنده C است که به برنامه‌نویس اجازه تعریف سمبلهایی را می‌دهند. برخی از این دستورها عبارتند از: #if، #region، #define. راهنماهایی نظیر #region تذکراتی به ویرایش‌گرها برای code folding می‌دهند.

توضیحات کد

توضیحات تک خط با استفاده از دو اسلش تعریف می‌شوند(//) و توضیحات چند خطی با /* شروع و به */ تمام می‌شوند.

public class Foo
{
// a comment
    public static void Bar(int firstParam) {}//Also a comment
}

public class FooBar
{
    /* a comment */
    public static void BarFoo(int firstParam) {}  /* Also a comment */

توضیحات چند خطی هم چنین می‌توانند با /* شروع و با */ تمام شوند.

public class Foo
{
    /* A Multi-Line
       comment  */
    public static void Bar(int firstParam) {}
}

سامانه مستندسازی XML

سامانه مستندسازی #C بسیار شبیه به جاوا است، اما مبنی بر XML. دو شیوه مستندسازی در حال حاضر به وسیله کامپایلر #C پشتیبانی می‌شود.

توضیحات تک خطی، که معمولاً در تولیدکننده کد Visual Studioپیدا می‌شوند، با استفاده از/// شروع می‌شوند.

public class Foo
{
/// < summary > A summary of the method. < /summary >
/// < param name="firstParam" > A description of the parameter. < /param >
/// < remarks > Remarks about the method. < /remarks >
    public static void Bar(int firstParam) {}
}

توضیحات چند خطی، که در نسخه ۱٫۰ تعریف شدند، اما در نسخه ۱٫۱ پشتیبانی از آن‌ها وجود نداشت با /* شروع و به */ ختم می‌شوند:

public class Foo
{
    /** < summary > A summary of the method. < /summary >
     *  < param name="firstParam" > A description of the parameter. < /param >
     *  < remarks>Remarks about the method. < /remarks > */
    public static void Bar(int firstParam) {}
}

نکته:در اینجا یک ملاک سخت در مورد استفاده از فضاهای خالی در سندهای XML هنگام استفاده از /**وجود دارد:

/**
 * < summary >
 * A summary of the method. < /summary > */

نوع دیگری از کد بالا ارائه خواهد شد:

/**
 * < summary >
   A summary of the method. < /summary > */

سینتکس سندسازی توضیحات XML در یک ضمیمه بی قاعده از استاندارد ECMA از سی شارپ وجود دارد. یک استاندارد مشابه قوانینی برای پردازش توضیحات و تبدیل آن‌ها به متون Plain در XML را با کمک قوانین CLI فراهم می‌کند. این به هر IDE در سی شارپ و دیگر ابزار گسترش دهنده امکان پیدا کردن هر نمادی را در کدها می‌دهد.

(CLR(Common Language Runtime

بخش مرکزی چارچوب دات‌نت، محیط اجرایی Runtime می‌باشد که اصطلاحاً به آن CLR یا .NET Runtime می‌گویند. کدهایی که تحت کنترل CLR اجرا می‌شوند اغلب به عنوان کدهای مدیریت شده نامیده می‌شوند.

اگر چه، پیش از این که کدها (همه زبان‌های چارچوب دات‌نت) به وسیله CLR اجرا شوند، بایستی مورد کامپایل قرار گیرند. در چارچوب دات‌نت عمل کامپایل در دو مرحله صورت می‌گیرد:

  1. کامپایل سورس کد به MSIL.
  2. کامپایل MSIL به کد مختص پلتفرم به وسیله CLR

یک نکته قابل توجه، اشتراک زبان میانی مایکروسافت با کد بایت جاوا(Bytecode)است. ایده این اشتراک از آنجا سرچشمه گرفت که چون Bytecode یک زیان سطح پایین با یک دستور زبان ساده می‌باشد (که به جای متن مبتنی بر کدهای عددی است)، می‌تواند به سرعت به کدهای بومی(Native) ترجمه شود.

برخی ویژگی‌های MSIL

  • شیءگرایی و بکارگیری واسط‌ها
  • تمایز فراوان بین انواع مقداری و ارجاعی
  • تعیین Strong Type (این نوع داده دیگر معتبر نیست)
  • مدیریت خطا از طریق به‌کارگیری Exception
  • بکارگیری صفات

 

منبع

 

آشنایی با #C قسمت 1
آشنایی با #C قسمت 2
آشنایی با #C قسمت 3

فوریه 5, 2020/0 دیدگاه /توسط daliri
https://behsanandish.com/wp-content/uploads/2018/08/images-3-1.jpg 300 380 daliri https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png daliri2020-02-05 10:00:182020-02-05 10:00:18آشنایی با #C قسمت 2

سیستم توصیه گر (Recommender System) قسمت 1

آموزش های عمومی هوش مصنوعی

سامانه توصیه گر

سیستم توصیه گر (به انگلیسی: Recommender System) یا سامانه پیشنهادگر (واژه سیستم یا سامانه گاهی با پلتفرم یا موتور جایگزین می‌شود)، با تحلیل رفتار کاربر خود، اقدام به پیشنهاد مناسب‌ترین اقلام (داده، اطلاعات، کالا و…)می‌نماید. این سیستم رویکردی است که برای مواجهه با مشکلات ناشی از حجم فراوان و رو به رشد اطلاعات ارائه شده‌است و به کاربر خود کمک می‌کند تا در میان حجم عظیم اطلاعات سریع‌تر به هدف خود نزدیک شوند. برخی سامانه پیشنهادگر را معادل پالایش گروهی (به انگلیسی: Collaborative filtering) می‌دانند.

مقدمه

پیش بینی می‌شد که تا اوایل سال ۲۰۰۷ میلادی در سایت دانشنامه اینترنتی ویکی‌پدیا چیزی حدود ۵٫۱ میلیون مقاله به ثبت رسیده باشد یا سایت مدیریت و به اشتراک‌گذاری تصاویر فلیکر بالغ بر ۲۵۰ میلیون تصویر را در خود جای دهد. از این رو، می‌توان گفت که ما در میان حجم عظیمی از داده و اطلاعات قرار گرفته‌ایم که بدون راهنمایی و ناوبری درست ممکن است انتخاب‌هایی غلط یا غیر بهینه از میان آن‌ها داشته باشیم. سیستم‌های توصیه‌گر سیستم‌های تأثیرگذار در راهنمایی و هدایت کاربر، در میان حجم عظیمی از انتخاب‌های ممکن، برای رسیدن به گزینه مفید و مورد علاقه وی هستند، به گونه‌ای که این فرایند برای همان کاربر شخصی‌سازی شده باشد.

تعاریف متفاوتی برای سیستم‌های توصیه‌گر ارائه شده‌است. از آن جمله، تعریف کلی‌نگر و خلاصه آقای Ting-peng liang در سال ۲۰۰۷ است که RS را زیرمجموعه‌ای از DSSها می‌داند و آن‌ها راسیستم‌های اطلاعاتی تعریف می‌کند که، توانایی تحلیل رفتارهای گذشته و ارائه توصیه‌هایی برای مسائل جاری را دارا هستند. به زبان ساده‌تر در سیستم‌های توصیه‌گر تلاش بر این است تا با حدس زدن شیوه تفکر کاربر (به کمک اطلاعاتی که از نحوه رفتار وی یا کاربران مشابه وی و نظرات آن‌ها داریم) به وی مناسب‌ترین و نزدیک‌ترین کالا به سلیقه او را شناسایی و پیشنهاد کنیم. این سیستم‌ها در حقیقت همان فرایندی که ما در زندگی روزمره خود به کار می‌بریم و طی آن تلاش می‌کنیم تا افرادی با سلایق نزدیک به خود را پیدا کرده و از آنها در مورد انتخاب‌هایمان نظر بخواهیم. توصیه‌هایی که از سوی سیستم‌های توصیه‌گر ارائه می‌شوند به طور کلی می‌توانند دو نتیجه دربرداشته باشند:

  • کاربر را در اخذ تصمیمی یاری می‌کنند (که مثلاً از میان چندین گزینه پیش رو کدام بهتر است و آن را انتخاب کند و …).
  • موجب افزایش آگاهی کاربر، در زمینه مورد علاقه وی می‌شود (مثلاً در حین ارائه توصیه به کاربر موجب می‌شود تا وی با اقلام و اشیاء جدیدی را که قبلاً آنها را نمی‌شناخته، آشنا شود).

سیستم‌های توصیه‌گر برای هر دو طرف یک تعامل (تجاری یا غیرتجاری)، مفید هستند و مزایایی را فراهم می‌آورد. برای نمونه در یک تعامل تجاری، مشتری‌ها از این جهت که عمل جستجو در میان حجم زیاد اطلاعات برای آن‌ها تسهیل و تسریع می‌شود، استفاده از سیستم‌های توصیه‌گر را مفید می‌دانند؛ فروشندگان به کمک این سیستم‌ها می‌توانند رضایت مشتریان را بالا برده و نیز فروش خود را افزایش دهد.

مزایا و پیشرفت‌ها

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

تاریخچه

تقریباً در اواسط دهه ۹۰ بود که مطالعه بر روی سیستم‌های توصیه‌گر به عنوان یک شاخه مستقل در تحقیقات مطرح شد و علت این توجه خاص، ابراز تمایل محققین، برای حل مشکل روش‌های توصیه‌گری بود که در رویکرد اولیه به مسئله جستجو در حجم فراوان اطلاعات، از آنها استفاده می‌شد.

ظرفیت رایانه‌ها در فراهم آوردن توصیه‌ها تقریباً از همان اوایل تاریخ‌چه رایانه‌ها شناخته شد. گراندی، یک کتابدار کامپیوتری گامی اولیه به سمت سامانه‌های توصیه‌گر خودکار بود. این کتابدار یک توصیه‌گر نسبتاً ساده و اولیه بود که کاربران را به قالب‌هایی بر اساس مصاحبه کوتاه با استفاده از اطلاعات مستقیم‌کدشده(hard-coded) دربارهٔ سلایق کتاب قالب‌های مختلف گروه‌بندی می‌کرد تا توصیه‌ها را تولید کند، ولی این کار ورود اولیه مهم به فضای سامانه‌های توصیه‌گر قلمداد می‌شود.

در اوایل دهه نود میلادی، تکنیک پالایش مشارکتی به عنوان راه‌حلی برای مدیریت فضای اطلاعات بسیار زیاد آنلاین بوجود آمدند. تپستری Tapestry یک سامانه پالایش مشارکتی دستی بود. این سامانه به کاربر اجازه انجام پرس‌وجو برای آیتم‌های موجود در یک حوزه اطلاعاتی مانند ایمیل بر اساس عقاید و اقدامات دیگر کاربران می‌داد (همه ایمیل‌هایی که از طرف John فوروارد شده‌اند را به من نشان بده). این‌کار مستلزم تلاش از طرف کاربرانش بود ولی به آنها اجازه کنترل واکنش‌های خوانندگان قبلی یک قسمت از مکاتبات را می‌داد تا میزان ارتباطش با آنها را تعیین کند.

خیلی زود بعد از سامانه‌های خودکار پالایش مشارکتی، مکان‌یابی خودکار عقاید مرتبط و تجمع آنها برای دادن توصیه مطرح شد. GroupLens از این تکنیک برای تعیین کردن مقاله‌های Usenet که احتمال دارد مورد علاقه کاربر خاصی باشد استفاده کرد. کاربران تنها نیاز داشتند تا نمره‌دهی یا دیگر اقدامات قابل مشاهده انجام دهند. سامانه اینها را با نمره‌ها یا اقدامات کاربران دیگر ترکیب می‌کرد تا نتایج شخصی‌شده تولید کند. با این سامانه‌ها، برای دریافت پیشنهادات، کابران نه قادرند هیچ اطلاعات مستقیمی از عقاید دیگر کاربران بدست بیاورند و نه نیازی دارند تا بدانند کاربران یا آیتم‌های دیگر سامانه چه‌چیزهایی هستند.

طی این دوره، سامانه‌های توصیه‌گر و پالایش مشارکتی تبدیل به موضوعی مورد علاقه در بین محققین حوزه‌های تعاملات انسان-رایانه، یادگیری ماشین و بازیابی اطلاعات شدند. این علاقه منجر به ایجاد تعدادی سامانه توصیه‌گر برای زمینه‌های مختلفی شد از جمله Ringo برای موسیقی، توصیه‌گر ویدیو BellCore برای فیلم‌ها و Jester برای لطیفه‌ها شد. خارج از دنیای رایانه، حوزه بازاریابی توصیه‌ها را برای توانایی‌شان در افزایش فروش و بهبود تجربه مشتریان آنالیز کرده است.

در اواخر دهه نود میلادی، پیاده‌سازی‌های تجاری فناوری توصیه‌گرها شروع به ظهور کردند. شاید معروف‌ترین کاربرد فناوری‌های سامانه‌های توصیه گر وب‌سایت Amazon.com باشد. بر اساس تاریخ‌چه خرید، تاریخ‌چه بازدید و آیتمی که کاربر درحال مشاهده آن است آنها به کاربر آیتم‌هایی را توصیه می‌کنند تا برای خرید درنظر بگیرد.

از زمان بکارگیری توسط آمازون، فناوری توصیه، اغلب بر اساس پالایش مشارکتی، در بسیاری از سامانه‌های تجارت الکترونیک و آنلاین تعبیه شده است. یک انگیزه قابل ملاحظه برای انجام اینکار افزایش حجم فروش است، مشتریان ممکن است کالایی را بخرند اگر آن کالا به آنها پیشنهاد شود ولی درغیراینصورت ممکن است آن کالا را نخرند. شرکت‌های بسیاری مانند NetPerceptions و Strands بخاطر فراهم کردن فناوری و خدمات توصیه به خرده‌فروشان آنلاین بوجود آمده‌اند.

جعبه ابزار تکنیک‌های توصیه گر به چیزی بیش از پالایش مشارکتی گسترش یافته‌اند و شامل رویکردهای محتوامحور(Content-Based) بر اساس متدهای بازیابی اطلاعات، استنتاج بیزی (Bayesian Inference) و استدلال مورد محور (Case-Based Reasonong) می‌باشد. این متدها بجای یا درعوض الگوهای نمره دهی کاربران، محتوا یا ویژگی‌های اصلی آیتم‌هایی که قرار است توصیه شود را درنظر می‌گیرند. با به بلوغ رسیدن استراتژی‌های توصیه مختلف، سامانه‌های توصیه‌گر ترکیبی (Hybrid Recommender Systems) نیز ظهور یافته‌اند و الگوریتم‌های مختلفی را در سیستم‌های مرکبی ترکیب کرده‌اند که بر اساس قدرت الگوریتم‌های تشکیل‌دهنده‌شان ایجاد شده‌اند. البته در کنار رویکردهای محتوا محور، پالایش مشارکتی، هم روش تکی و هم ترکیب‌شده‌اش به عنوان روشی مؤثر همچنان مطرح هستند.

زمانی که Netflix جایزه Netflix Prize را در سال ۲۰۰۶ به منظور بهبود بخشیدن وضعیت توصیه‌های فیلمش برقرار کرد، تحقیق بر روی الگوریتم‌های سامانه‌های توصیه‌گر توجه بسیاری را به خودش جلب کرد. هدف این رقابت ساختن یک الگوریتم توصیه‌گری بود که بتواند الگوریتم CineMatch که متعلق به خود Netflix بود را با ۱۰٪ بهبود در آزمایشات آفلاین شکست دهد. این امر موجب ایجاد خروشی از اقدامات شد، هم در بین محیط آکادمیک و هم در بین سایر علاقمندان. جایزه یک میلیون دلاری ارزشی را که فروشندگان برای دقت توصیه‌ها قائل هستند نشان می‌دهد[۱].

کاربردها

سیستم‌های توصیه‌گر کاربردهای فراوانی دارند که برخی از زمینه‌های کاربردی آن به شرح زیر است:

  • تجارت الکترونیک: برای توصیه محصولات و خدمات مختلف.
  • اینترانت‌های بنگاهی: برای پیدا کردن افراد خبره در یک زمینه خاص یا افرادی که در رویارویی با شرایط مشابه، تجاربی کسب کرده و راه حل‌هایی یافته‌اند (بیشتر داخل یک سازمان کاربرد دارد).
  • کتابخانه دیجیتال: پیدا کردن کتاب، مقاله و …
  • کاربردهای پزشکی: انتخاب پزشک متناسب با شرایط (مکان، نوع بیماری، زمان و …) بیمار، انتخاب دارو و …
  • مدیریت ارتباط با مشتری CRM: برای ارائه راهکارهایی برای حل مشکلات تولیدکننده و مصرف‌کننده در زنجیره تأمین.

مقایسه سامانه‌های توصیه گر و سامانه‌های تصمیم‌یار کلاسیک

اگر چه شباهت‌های بسیاری بین این دو سیستم وجود دارد اما بین آن‌ها تفاوت‌هایی هم هست، که مهم‌ترین این تفاوت‌ها، این است که در DSSها کاربر نهایی مدیران ارشد یا میانی یک سازمان هستند، در حالی که در سیستم‌های توصیه‌گر کاربری سیستم به سطح خاصی محدود نمی‌شود و سیستم مورد استفاده عام است. اما عمده شباهت این دو سیستم نیز بر این اساس که سیستم‌های توصیه‌گر، جدای از دیدگاه سطوح کاربری و به لحاظ فنی، به نوعی زیر مجموعه DSS به شمار می‌روند. هر دوی آنها کاربر خود را در اخذ تصمیم، یاری می‌کنند و هر دو سیستم‌های اطلاعاتی‌ای هستند که دارای پایگاه دانش، پایگاه داده، رابط کاربری و … می‌باشند.

تعاریف و اصطلاحات عمده

لازم است برای درک مفهوم سیستم توصیه‌گر، مفاهیم چهارگانه و ابتدایی زیر را بررسی کنیم.

  • در سیستم‌های توصیه گر به کاربری که توصیه جاری در سیستم، برای وی در حال پردازش و آماده شدن است، کاربر فعال یا کاربر هدف می‌گویند.
  • الگوریتم‌های به کار رفته در این سیستم‌ها، از ماتریسی به نام ماتریس رتبه‌ها استفاده می‌کنند؛ اصطلاحات رایج برای این ماتریس Rating Database و Preference Database نیز هستند.
  • از فعل مصرف کردن در سیستم‌های توصیه‌گر، زمانی استفاده می‌کنند که کاربر توصیه ارائه شده را می‌پذیرد. به عبارتی وقتی کاربری پیشنهادی را که توسط سیستم به وی شده می‌پذیرد، می‌گوییم کاربر آن پیشنهاد را مصرف کرده، این پذیرش می‌تواند به شکل‌های مختلفی باشد، مثلاً کاربر، کتاب پیشنهادی را می‌خرد، سایت پیشنهادی را مرور می‌کند یا به شرکت خدماتی ای که به او پیشنهاد شده مراجعه می‌کند. ساختار ماتریس رتبه‌ها بدین گونه‌است که در آن، هر سطر ماتریس نمایانگر یک کاربر و هر ستون آن معرف کالایی (شئای) خاص است.

حال با مفهوم تابع سودمندی آشنا خواهیم شد که قصد داریم به کمک آن یک مدل کلی ریاضی از سیستم‌های توصیه‌گر را نیز ارائه دهیم. در واقع یک سیستم توصیه‌گر را می‌توان با این نگاشت همسان دانست و مدل کرد: {\displaystyle u:C*S->R}{\displaystyle u:C*S->R}

فرض کنید C مجموعه تمامی کاربران و S مجموعه اقلام در دسترس باشند. تابعی را که میزان مفید و متناسب بودن کالای S برای کاربر C را محاسبه می‌کند با u نشان می‌دهیم، که در آن R مجموعه‌ای است کاملاً مرتب (براساس میزان اهمیت). هرکدام از عناصر S را می‌توان با مجموعه‌ای از خصوصیات، مشخص کرد. برای مثال، محصولی مثل فیلم را می‌توان با مشخصه‌هایی چون عنوان فیلم، کارگردان، طول زمانی فیلم، تاریخ تولید و … ثبت کرد. همچنین عناصر مجموعه C را نیز می‌توان بر اساس ویژگی‌های مثل سن، جنسیت و … ثبت کرد. (باید توجه داشت که u روی تمام فضای مجموعه آغازین S×C تعریف شده نیست؛ از این رو باید برون‌یابی شود)

 

سیستم توصیه گر (Recommender System) قسمت 1
سیستم توصیه گر (Recommender System) قسمت 2
سیستم توصیه گر (Recommender System) قسمت 3

فوریه 1, 2020/0 دیدگاه /توسط daliri
https://behsanandish.com/wp-content/uploads/2018/03/photo_2016-08-18_11-05-51.jpg 256 256 daliri https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png daliri2020-02-01 10:00:322020-02-01 10:00:32سیستم توصیه گر (Recommender System) قسمت 1

سیستم خبره قسمت 1

آموزش های عمومی هوش مصنوعی

سیستم خبره

سامانه‌های خِبره یا سیستم های خبره به دسته‌ای خاص از نرم‌افزارهای رایانه‌ای اطلاق می‌شود که در راستای کمک به کاردانان و متخصّصان انسانی یا جایگزینی جزئی آنان در زمینه‌های محدود تخصّصی تلاش دارند. اینگونه سامانه‌ها، در واقع، نمونه‌های آغازین و ساده‌تری از فناوری پیشرفته‌تر سیستم های دانش-بنیان به شمار می‌آیند.

این سیستم ها معمولاً اطلاعات را به شکل واقعیت ها و قواعد در دادگانی به نام پایگاه دانش به شکل ساختار مند ذخیره نموده، و سپس با بهره‌گیری از روشهایی خاص استنتاج از این داده‌ها نتایج مورد نیاز حاصل می‌شود.

 نمونه‌ای از یک کامپیوتر لیسپ با کیبورد اسپیس کادت

 نمونه‌ای از یک کامپیوتر لیسپ با کیبورد اسپیس کادت

پیشگفتار

در میان اهل فن و صاحبان اندیشه، استدلال تعاریف و تفاسیر گوناگونی دارد. در نگاهی کلی، بهره گرفتن از دلیل و برهان برای رسیدن به یک نتیجه از فرضیاتی منطقی با بکارگیری روش‌های شناخته شده، تعریفی از استدلال تلقی می‌شود؛ تعریفی که البته با دیدگاه‌های فلسفی و گاه آرمانگرایانه از استدلال تفاوت دارد. با این حال موضوع مهم و بنیادین در اینجا بحث در چیستی و چرایی این دیدگاه‌ها نیست، بلکه در مورد “چگونگی طراحی دستگاه‌های استدلال گر”، با هر تعریفی، برای رسیدن به مجموعه‌ای از تصمیمات منطقی با استفاده از مفروضات یا به طور دقیق‌تر دانشی است که در اختیار آن‌ها قرار می‌گیرد. سیستم های خبره(expert systems) اساساً برای چنین هدفی طراحی می‌شوند. در حقیقت به واسطه الگوبرداری این سیستم ها از نظام منطق و استدلال انسان و نیز یکسان بودن منابع دانش مورد استفاده آن‌ها، پیامد کار یک سیستم خبره می‌تواند تصمیماتی باشد که در حوزه‌ها و قلمروهای گوناگون قابل استفاده، مورد اطمینان و تأثیرگذار هستند. بسیاری بر این باورند که سیستم های خبره بیشترین پیشرفت را در “هوش مصنوعی” به وجود آورده‌اند.

تاریخچه

تا ابتدای دههٔ ۱۹۸۰ (م) کار چندانی در زمینهٔ ساخت و ایجاد سیستم های خِبره توسط پژوهش گران هوش مصنوعی صورت نگرفته بود. از آن زمان به بعد، کارهای زیادی در این راستا و در دو حوزهٔ متفاوت ولی مرتبط سیستم های کوچک خبره و نیز سیستم های بزرگ خبره انجام شده است.

در دهه ۱۹۷۰، ادوارد فیگن بام در دانشگاه استانفورد به دنبال کشف روش حل مسئله ای بود که خیلی کلی و همه منظوره نباشد. پژوهشگران دریافتند که یک متخصص معمولاً دارای شماری رموز و فوت و فن خاص برای کار خود می‌باشد و در واقع از مجموعه‌ای از شگردهای سودمند و قواعد سرانگشتی در کار خود بهره می‌برد، این یافته مقدمه پیدایش سیستم خبره بود. سیستم خبره با برگرفتن این قواعد سر انگشتی از متخصصین و به تعبیری با تبدیل فرایند استدلال و تصمیم‌گیری متخصصین به برنامه‌های رایانه‌ای می‌تواند به عنوان ابزار راهنمای تصمیم‌گیری در اختیار غیرمتخصص و حتی متخصصین کم تجربه قرار گیرد.

هوش مصنوعی: هوش مصنوعی روشی است در جهت هوشمند کردن رایانه تا قادر باشد در هر لحظه تصمیم‌گیری کرده و اقدام به بررسی یک مسئله نماید. هوش مصنوعی، رایانه را قادر به اندیشیدن می‌کند و روش آموختن انسان را رونوشت برداری می‌نماید؛ بنابراین اقدام به جذب اطلاعات جدید جهت بکارگیری در مراحل بعدی می‌پردازد.

مغز انسان به بخش‌هایی تقسیم شده است که هر بخش وظیفه خاص خود را جدا از بقیه انجام می‌دهد. آشفتگی در کار یک بخش تأثیری در دیگر بخشهای مغز نخواهد گذاشت. در برنامه‌های هوش مصنوعی نیز این مسئله رعایت می‌شود درحالی که در برنامه‌های غیر هوش مصنوعی مثل C یا Pascal تغییر در برنامه روی سایر قسمت‌های برنامه و اطلاعات تأثیر دارد.

مباحث کاربردی و مهم در تحقق یک سیستم هوش مصنوعی:

    • سیستم های خبره (Expert Systems)
    • شبکه‌های عصبی (Neural Network)
    • الگوریتم‌های ژنتیک (Genetic Algorithms)
    • سامانه‌های منطق فازی (Fuzzy Logic Systems)

حوزه‌های کاربرد

سیستم های خبره در زمینه‌های بسیار متنوعی کاربرد یافته‌اند که برخی از این زمینه‌ها عبارتند از پزشکی، حسابداری، کنترل فرایندها، منابع انسانی، خدمات مالی، و GIS. حسابداری، تجزیه و تحلیلهای مالی پزشکی (تشخیص بیماری)، آنژیوگرافی، باستان‌شناسی، تولید ویفرهای سیلیکونی و انواع خاصی از پرتونگاری در زمینه‌های مختلف دیگری نیز سیستمهای خبره پدید آمده‌اند همانند: مشاوره حقوقی، مشاوره برای انتخاب بهترین معماری یا ترکیب بندی سامانه کامپیوتری، مشاوره مهندسی ساختمان و غیره.

در هر یک از این زمینه‌ها می‌توان کارهایی از نوع راهنمایی، پردازش، دسته‌بندی، مشاوره، طراحی، تشخیص، کاوش، پیش بینی، ایجاد مفاهیم، شناسایی، توجیه، یادگیری، مدیریت، واپاشی، برنامه‌ریزی، زمان‌بندی و آزمایش را با مددجویی از سامانه‌های تجربی با سرعت و آسانی بیشتری به انجام رسانید.

سیستم های خبره یا به عنوان جایگزین فرد متخصص یا به عنوان کمک به وی استفاده می‌شوند.

کاربرد سیستم های خبره در خدمات کتابداری و اطلاع‌رسانی

سیستم های خبره این امکان را در اختیار می‌گذارد تا بتوان دانش موجود در سطح جامعه را به صورت گسترده‌تر و کم هزینه تری اشاعه داد. این موضوع یعنی اشاعه دانش برای عموم مردم یکی از بنیادی‌ترین و اصلی‌ترین وظایف و رسالتهای حوزه کتابداری است .
مثلاً از طریق واسطهای هوشمند جستجوی اطلاعات می‌توان مهارتهای جستجوی پیشرفته را که اغلب خاص متخصصان با تجربه است در میان طیف وسیعی از کاربران در دسترس قرار دهد. سرعت استدلال یا حل مسائل در نظام‌های خبره می‌تواند منجر به ارائه خدمات کاراتر و سریع تر در برخی فعالیتهای کتابداری شود و انعطاف‌پذیری بیشتری را در پاسخگویی به نیازهای مخاطبان به وجود آورد.

کاربرد سیستم های خبره و هوشمند را در حوزه‌های نمایه سازی، چکیده نویسی، طراحی و تولید اصطلاح‌نامه‌ها، فهرست نویسی، بازیابی متن فارغ از منطق بولی، بازیابی متون مبتنی بر منطق بولی، تجزیه و تحلیل خودکار محتوا و ارائه دانش، مدیریت و دسترسی به محتوی پایگاه‌های رابطه‌ای، اسناد هوشمند، پردازش پایگاه‌های اطلاعاتی دانسته‌اند.

کاربرد سیستم های خبره در حسابداری و امور مالی

یکی از پر رونق‌ترین زمینه‌های کاربرد سیستم های خبره، حوزه و تجزیه و تحلیلهای مالی است. یکی از مناسب‌ترین زمینه‌های کاربرد این سیستم ها حوزه حسابداری و امور مالی است. امروزه انواع زیادی از سیستم های خبره برای کاربردهای گوناگون در این شاخه از دانش بشری ساخته شده است که در مورد استفاده گروه‌های مختلفی از تصمیم گیرندگان مانند مدیران شرکتها و سازمانها، حسابداران، تحلیلگران مالی، کارشناسان مالیاتی و بالاخره عامه مردم قرار می‌گیرد حتی متخصصین و کارشناسان حوزه‌های مختلف دانش حسابداری و مالی از این نرم‌افزارهای پر جاذبه به عنوان وسیله‌ای برای یافتن «حدس دوم» و اطمینان بیشتر نسبت به یافته‌ها و داوری‌های شخصی خود استفاده می‌کنند.

کاربردهای مختلفی از سیستم های خبره در سه زمینه حسابداری، حسابداری مدیریت و امور مالیاتی به شرح ذیل می‌باشد:

    • حسابرسی :ارزیابی ریسک – تهیه برنامه حسابرسی – فراهم آوردن کمکهای فنی – کشف تقلبات و جلوگیری از آنها
    • حسابداری مدیریت :قیمت گذاری محصولات و خدمات – تعیین بهای تمام شده – طراحی سیستمهای حسابداری – بودجه بندی سرمایه‌ای – انتخاب روش حسابداری – ارزیابی اعتبار – ایجاد و برقراری واپاشی (کنترل)
    • امور مالیاتی : توصیه‌های مالیاتی – محاسبه مابه التفاوتهای مالیاتی – برنامه‌ریزی مالی شخصی.

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

انواع سیستم های خبره تحلیل مالی

از آنجا که در داوریهای مختلف مالی عملاً هر چهار مرحله فرایند تصمیم‌گیری یعنی گردآوری داده‌ها، انجام واکاوی، کسب بینش مشخص راجع به موضع و بالاخره تصمیم‌گیری دخالت دارد سیستم های خبره مرتبط با موضوع تحلیل مالی نیز بر پایهٔ نوع کمکی که به مراحل مختلف فرایند تصمیم‌گیری می‌کنند به سه قلمرو تقسیم می‌شوند.

این سه قلمرو عبارتند از:

    1. کمک به کسب بینش یا بینش آفرین Insight facilitaing
    2. آسان سازی تصمیم‌گیری Decision facilitating
    3. تصمیم سازی Decision Making

سیستم های خبره بینش آفرین

در این نوع سیستم ها، هدف اصلی ارائه پردازش‌های مربوط به کمک واکاوی نسبتها و نمودار هاست این نسبت‌ها و نمودارها برای دست اندرکاران تحلیل مالی در ایجاد بینش دقیق تری در مورد وضع مالی و چشم‌انداز آتی یک مؤسسه، یعنی سودمند است با چنین هدفی عملاً مراحل اول و دوم از فرایند چهار مرحله‌ای تصمیم‌گیری به کمک این سیستم ها انجام می‌شود این نرم‌افزارها را به این دلیل بینش آفرین می‌خوانیم که هدفشان کمک به کارگزاران و دست اندرکاران مالی برای انجام یک مشاهده بینش آفرین مشخص است بنابر این درجه از کارآزمودگی و تخصص موجود در زمره سیستم های خبره واقعی به حساب آورده نمونه‌هایی از این قبیل نرم‌افزارها عبارتند از: INsiGht و NEWVIEWS که هر دو عملاً سیستم های جامع حسابداری مشتمل بر تحلیلهای مالی اند یعنی در عین اینکه همه عملیات حسابداری را انجام می‌دهند. در محیطهای شبیه صفحه گسترده تحلیلهای مالی خود را نیز عرضه می‌کنند نرم‌افزار شناخته شده دیگر REFLEX نام دارد که ۱۲ نسبت کلیدی را محاسبه کرده و تحلیل و تفسیرهای پیشنهادی خود را نیز ارائه می‌کند این تحلیلها همراه با ارائه نسبت‌ها، روندها و نمودارهای مناسب است.

سیستم های خبره آسان کننده تصمیم‌گیری

در این نوع از سیستم های خبره مالی یک پایگاه دانش وجود دارد که ضمن تحلیل نسبتهای مالی می‌تواند بینشهای خود نسبت به موضوع مورد تحلیل را نیز ارائه دهد و همین امر موجب تمایز آن از سیستم های دسته اول می‌شود بنابر این در این قبیل سیستمها سه مرحله از چهار مرحله فرایند تصمیم‌گیری انجام می‌شود یک نمونه از این سیستم های خبره «ANSWERS» است.

سیستم های خبره

سیستم های خبره برنامه‌هایی هستند که رفتار یک انسان متخصص در یک زمینه بخصوص را تقلید می‌کنند. این برنامه از اطلاعاتی که استفاده کننده در آن‌ها ذخیره می‌کند جهت اعلام یک عقیده در یک موضوع بخصوص استفاده می‌کند. از این رو سیستم‌های خبره تا هنگامی که بتوانند موضوعی را که با پاسخ‌های شما مطابقت داشته باشد بیابند به سؤال کردن از شما ادامه می‌دهند. به منظور درک کردن آنچه یک سیستم متخصص انجام می‌دهد مکالمه زیر که بین یک متخصص در امور میوه و فرد دیگری که می‌خواهد از وی توصیه‌ای در این مورد دریافت کند را در نظر بگیرید:

— متخصص: آیا میوه سبز است؟

— استفاده کننده: خیر.

— متخصص: آیا میوه قرمز است؟

— استفاده کننده: بله.

— متخصص: آیا این میوه روی درخت رشد می‌کند؟

— استفاده کننده: خیر.

— متخصص: آیا این میوه روی یک بوته رشد می‌کند؟

— استفاده کننده: بله.

— متخصص: آیا این بوته تیغ دارد؟

— استفاده کننده: بله.

— متخصص: این میوه تمشک است!

هدف از طراحی یک سیستم متخصص رایانه‌ای در امر میوه تولید چنین گفتگویی است. در حالت عمومی تر سیستم متخصص می‌کوشد که به استفاده کننده از خود در مورد موضوعی که از آن آگاه است راهنمایی دهد.

اگر بخواهیم تعریفی از سیستم های خبره ارایه دهیم می‌توان گفت «سیستم های خبره برنامه‌های رایانه‌ای هستند که با استفاده از قواعد مورد استفاده متخصصین به حل مسایل در زمینه‌ای خاص می‌پردازند. وجه تمایز اصلی سیستم های خبره نسبت به برنامه‌های کاربردی گذشته آن است که از استدلال مبتنی بر استنباط و استنتاج استفاده می‌کند در برنامه‌های کاربردی معمولی دارای الگوریتم و روش حل مسئله ثابتی هستیم اما در روش‌های شهودی می‌توان با آزمون و خطا مسایل دشوارتری را حل کرد و به جواب رضایت بخش رسید.

مفهوم سیستم های خبره بر این فرض استوار است که دانش متخصصین در حافظه رایانه ضبط و در دسترس کسانی که به کاربرد آن دانش نیاز دارند، قرار گیرد. یک سیستم های پشتیبانی تصمیم شامل برنامه‌هایی است که بازتاب دهندهٔ چگونگی نگرش یک مدیر در حل یک مسئله می‌باشد. یک سیستم خبره، ازطرف دیگر فرصتی برای تصمیم‌گیری‌ها پیش می‌آورد که از قابلیت‌های مدیر افزون تر است. تمایز دیگر میان سیستم خبره و سیستم پشتیبانی تصمیم، توانایی سیستم خبره در توصیف چگونگی استدلال جهت دستیابی به یک راهکار خاص است. اغلب اوقات شرح نحوه دست یابی به یک راه حل، از خود راه حل ارزشمندتر است.

داده‌هایی که به وسیله برنامه‌های سیستم  پشتیبانی تصمیم استفاده می‌شود، اصولاً به صورت عددی بوده و برنامه‌ها، تأکید بر استفاده از روش‌های ریاضی دارند، لیکن داده‌هایی که به وسیله سیستم های خبره به کار می‌رود نمادی تر بوده و اغلب به صورت متن تشریحی می‌باشند. برنامه‌های سیستم‌های خبره بر به کارگیری برنامه‌های منطقی تأکید دارند.

تفاوت سیستم های خبره با سایر سیستم های اطلاعاتی

سیستم های خبره برخلاف سیستم های اطلاعاتی که بر روی داده‌ها(Data) عمل می‌کنند، بر دانش (Knowledge) متمرکز شده است. همچنین دریک فرایند نتیجه‌گیری، قادر به استفاده از انواع مختلف داده‌ها عددی(Digital)، نمادی Symbolic و مقایسه‌ای (Analog) می‌باشند. یکی دیگر از مشخصات این سیستم‌ها استفاده از روشهای ابتکاری (Heuristic) به جای روشهای الگوریتمی می‌باشد. این توانایی باعث قرار گرفتن دامنهٔ گسترده‌ای از کاربردها در برد عملیاتی سیستم های خبره می‌شود. فرایند نتیجه‌گیری در سیستم های خبره بر روشهای استقرایی و قیاسی پایه‌گذاری شده است. از طرف دیگر این سیستم ها می‌توانند دلایل خود در رسیدن به یک نتیجه‌گیری خاص یا جهت و مسیر حرکت خود به سوی هدف را شرح دهند. با توجه به توانایی این سیستم‌ها در کار در شرایط فقدان اطلاعات کامل یا درجات مختلف اطمینان در پاسخ به پرسشهای مطرح‌شده، سیستم های خبره نماد مناسبی برای کار در شرایط عدم اطمینان(Uncertainty) یا محیطهای چند وجهی می‌باشند.

سیستم خبره قسمت 1
سیستم خبره قسمت 2
سیستم خبره قسمت 3
سیستم خبره قسمت 4
سیستم خبره قسمت 5
سیستم خبره قسمت 6

ژانویه 11, 2020/0 دیدگاه /توسط daliri
https://behsanandish.com/wp-content/uploads/2018/01/expertsystemf.jpg 256 256 daliri https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png daliri2020-01-11 10:00:592020-01-11 10:00:59سیستم خبره قسمت 1

دوربین دیجیتال چیست؟ قسمت 3

دوربین (camera)

اصلاح دیجیتالی عکس در دوربین

عکس دیجیتال عبارت از ارقام صفر ویک است که می توان به طریق الکترونیکی اندازه آنها را کم و زیاد کرد . این بدین معنی است که بلافاصله بعد ازاینکه اطلاعات مربوط به عکس در سنسور نوری ثبت و مشخص شد ، می توان این اطلاعات را ادیت یا تصحیح کرد . اینکه چه کارکردهایی در این رابطه وجود دارند و دست شما چقدر باز است ، بستگی به مدل دوربین دارد و در هر دوربینی فرق می کند . بنابراین جهت اطلاع از امکانات دوربین خود در این زمینه به دفترچه راهنمای آن مراجعه کنید .

اندازه عکس

در اکثر دوربینهای دیجیتال امکان عوض کردن اندازه عکس وجود دارد . این اندازه معمولا” به واحد پیکسل بیان می شود ،1920×2560،1200×1600،960×1280 و یا 480×640 ، هرچه اندازه قطع عکس را کوچک تر انتخاب کنید ، می توانید تعداد عکسهای بیشتری را روی کارت حافظه ذخیره کنید . یک عکس کوچک باعث می شود که ارسال آن ازطریق e-mail ساده تر و سریع تر صورت گیرد . اما از طرف دیگر این نوع عکس ها ، مناسب چاپ در قطع بزرگ نیستند .

کیفیت عکس

عکس در فرمت غیر فشرده ، فضای زیادی را اشغال خواهد کرد . اگر شما کیفیت پایین تری برای عکس انتخاب کنید می توانید اندازه فایل خود را با کمک برنامه های فشرده سازی کوچک کنید . البته در حالت فشرده کردن فایل مقداری از اطلاعات عکس حذف می شوند . کیفیتهای عادی عکس عبارتند از استاندارد ، نرمال ، خوب و RAW به معنی خام . حالت RAW که بهترین کیفیت عکس را ارائه می کند ، فرمت غیر فشرده عکس است که مخصوص دوربینی که با آن کار می کنید ، است .

وضوح عکس

دوربین می تواند وضوح عکس را جهت نشان دادن جزئیات بیشتر افزایش دهد . این مسئله را با فوکوس کردن مخلوط نکنید ، اینها دو مقوله جدا از هم هستند . اگر خطوط مرزی ( لبه های) سوژه سخت وغیر ظریف باشند ، جزئیاتی کمتر در عکس دیده می شوند . در حالت عادی ، قبل از اینکه عکس در کارت حافظه ضبط شود ، مقداری لبه های آن واضح تر می شوند .

تعادل نور سفید

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

حالت رنگ

بعضی از دوربینها دارای قابلیت عکاسی در حالت رنگ های مختلف مثل سیاه و سفید ، غلظت رنگ بالا و یا پایین و یا  تون قهوه ای رنگ معروف به سپیا (Sepia )هستند .

حساسیت به نور

در دوربینهای معمولی که با فیلم کار می کنند و در این کتاب دوربینهای آنالوگ نامیده می شوند ، می توان حساسیت فیلم را مناسب نوع فیلمی که به کار می برید ، انتخاب وتنظیم کرد . هرچه حساسیت فیلم پایین تر باشد ، دانه هایی که روی فیلم هستند ریزتر و جزئیات زیادتری از سوژه در عکس ثبت می شوند . واحد حساسیت فیلم به ISO بیان می شود که ترکیبی از سیستم آمریکایی ASA وسیستم آلمانی DIN است . مثلا” 400/27˚ ISO واحدی برای نمایش فیلم با حساسیت 400 ایزو است .

در یک دوربین عکاسی دیجیتال باید دید که کارخانه سازنده آن چه حساسیتی را برا ی آن مدل در نظر گرفته است. هر اندازه ای که دوربین برای آن تنظیم و ساخته شده باشد، همه عکسها بر مبنای آن حساسیت گرفته خواهند شد. حساسیت برای یک سنسور نوری CCD به صورت ISO بیان می شود. حساسیت سنسور نوری در دوربین های دیجتال کمپکت معمولا” 100 ایزو است. بعضی از دوربینها دارای قابلیت تغییر ایزو یا حساسیت فیلم از طریق تقویت سیگنالهای الکترونیکی هستند. این کارکرد باعث می شود که حتی در زیر نور ضعیف هم بتوان عکاسی کرد ولی عکسی که شما دریافت خواهید کرد، دارای برفک و پارازیت خواهد بود.

کار روی عکسها درون دوربین

دوربین دیجیتال در حقیقت کامپیوتر کوچکی است که با آن نه تنها می توان عکس گرفت ، بلکه می توان در سازماندهی و نشان دادن عکسها هم از آن استفاده کرد. امکانات موجود در دوربینهای مختلف فرق می کنند در زیر چند نمونه مرسوم آنها آورده می شوند.

ذخیره عکسها در پوشه های مختلف

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

تنظیم نامگذاری عکسها

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

حذف کردن عکسها

عکسهای ناجور و نامطلوب را می توانید بلافاصله پس از رویت پاک کنید. هم چنین می توانید در پایان یک روز همراه با عکاسی ، عکسها را یک به یک رویت کنید و آنهایی را که نمی خواهید، پاک کنید. به این طریق می توانید، جا برای عکسهای جدید خود ایجاد کنید.

منبع


دوربین های دیجیتال:

 

دوربین ۳۶۰ درجه ی ozo محصول نوکیا

دوربین دیجیتال دوربین هایی هستند که برای گرفتن عکس و ذخیره آن بجای فیلم عکاسی از حسگرهای حساس به نور معمولاً از نوع CCD یا CMOS استفاده می‌کند و تصویر گرفته شده توسط سنسور طی چند مرحله به حافظهٔ دوربین برای استفاده فرستاده می‌شود.

تاریخچه:

در سال ۱۹۷۵ اولین دوربین دیجیتال جهان توسط استیون ساسون (Steve Sasson) یکی از مهندسان شرکت ایستمن کداک (Eastman Kodak) ساخته شد. این ابزار ۳٫۶ کیلوگرمی می توانست عکس‌های ۰٫۰۱ مگاپیکسلی خود را بر روی یک نوار کاست ضبط کند و نوردهی هر عکس به ۲۳ ثانیه زمان نیاز داشت.

 

اولین دوربین دیجیتال دنیا

عملکرد:

 

گرچه اصول کلی این دوربین‌ها شبیه به دوربین‌های فیلمی هستند، نحوه کار داخل این دوربین‌ها کاملاً متفاوت است. در این دوربین‌ها تصویر توسط یک سنسور CCD یا یک CMOS گرفته می‌شود. CCD بصورت ردیفها و ستونهایی از سنسورهای نقطه‌ای نور هستند که هر چه تعداد این نقاط بیشتر و فشرده تر باشد، تصویر دارای دقت بالاتری است) هر سنسور نور را به ولتاژی متناسب با درخشندگی نور تبدیل کرده و آن را به بخش تبدیل سیگنال‌های آنالوگ به دیجیتال ADC می‌فرستد که در آنجا نوسانات دریافتی از CCD به کدهای مجزای باینری(عددهای مبنای دو بصورت صفر و یک) تبدیل می‌شود. خروجی دیجیتال از ADC به یک پردازنده سیگنال‌های دیجیتال DSP فرستاده می‌شود که کنتراست و جزئیات تصویر در آن تنظیم می‌شود و قبل از فرستادن تصویر به حافظه برای ذخیره تصویر، اطلاعات را به یک فایل فشرده تبدیل می‌کند. هر چه نور درخشنده‌تر باشد، ولتاژ بالاتری تولید شده و در نتیجه پیکسل‌های رایانه‌ای روشن‌تری ایجاد می‌شود. هر چه تعداد این سنسورها که به‌صورت نقطه هستند بیشتر باشد، وضوح تصویر به دست آمده بیشتر است و جزئیات بیشتری از تصویر گرفته می‌شود.

سنسورهای CCD و CMOS

دوربین‌های دیجیتال برای دریافت نور از یک تصویر دیجیتالی،  از سنسورهای مشخصی استفاده می‌کنند که معمولاً CCD (افزاره ی بار جفت ‌شده) یا  CMOS (نیم رسانای اکسید فلزی مکمل) نامیده می‌شوند. هر دو سنسورهای نام‌برده شده در اغلب دوربین‌های دیجیتال استفاده‌شده و ابزاری مناسب برای گرفتن تصاویر دیجیتالی به حساب می‌آیند. سنسورهای CCD و CMOS به طور معمول به اندازه‌ی یک ناخن انگشت بوده و تماماً از سیلیکون ساخته‌شده‌اند. سطح این سنسورها شامل میلیون‌ها دیود فوق‌العاده کوچک است که هر کدام یک پیکسل از تصاویر گرفته‌شده توسط لنز دوربین را ثبت می‌کنند. به طور کلی دیودهای بیشتر بر روی سطح یک دوربین دیجیتال برابر است باکیفیت بهتر تصاویر گرفته‌شده توسط آن دوربین! جالب است بدانید واژه‌ی مگا پیکسل در مشخصات یک دوربین حاکی از تعداد سنسورهای موجود بر روی سطح CCD یا CMOS است.

 

سنسور CMOS و سنسور CCD

تفاوت دیجیتال و آنالوگ چیست؟

در فناوری آنالوگ، امواج و یا سیگنال به شکل اولیه ضبط و یا استفاده میشوند. برای مثال در یک دستگاه ضبط صوت آنالوگ سیگنال دریافت شده مستقیما از میکروفون دریافت و به نوار کاست منتقل میشود. صوت شما که از میکروفن دریافت میشود به صورت طبیعی یا همان آنالوگ است و امواج ضبط شده بر روی نوار کاست نیزبه همین صورت (آنالوگ) خواهد بود. این امواج میتواند از روی نوار خوانده و یا تقویت شوند و برای تولید صدا به بلندگو ها فرستاده شوند. واژه انالوگ از واژه یونانی ΑΝΆΛΟΓΟΣ که معنای “نسبی” می دهد گرفته شده است.

در فناوری دیجیتال امواج نمونه ای از امواج آنالوگ در یک سری از فواصل میشوند. سپس تبدیل به یک سری اعداد(صفر و یک) میشوند که توانایی ذخیره شدن روی دستگاه های دیجیتالی را خواهند داشت.

در یک سی دی میزان این نمونه سازی ۴۴۰۰۰ نمونه (سیگنال) در هر ثانیه است. به عبارت دیگر ۴۴۰۰۰ شماره در هر ثانیه از یک موسیقی توسط دستگاه خوانده میشود. برای شنیدن موسیقی اعداد به صورت امواج ولتاژ(مستقیم یا متناوب) در می آیند که به صوت اصلی بسیار نزدیک است.

واژه دیجیتال از لغت DIGIT (رقم) ویا DIGITUS (واژه پونانی به معنی انگشت) گرفته شده، بخاطر اینکه از انگشتان برای شمارش استفاده میشود.

تصاویر رنگی در دوربین های دیجیتال:

برای ثبت عکس‌های رنگی، بر روی هر سنسور یک فیلتر نصب می‌شود که اجازه عبور رنگ‌های نوری معینی را می‌دهد. در واقع همه دوربین‌های دیجیتال موجود در زمان حاضرتنها می‌توانند یکی از سه رنگ اصلی را در هر سنسور دریافت کنند و در نتیجه این که تقریبا از سه تا رنگ اصلی دوتای آن دور ریخته می‌شود. برای جبران این موضوع دوربین باید دو رنگ اصلی دیگر را تخمین بزند تا بتواند رنگ کاملی در هر پیکسل به دست آورد. معمول ترین روش برای کار استفاده از آرایه فیلتر رنگ است که یکی از آنها به نام «فیلتر بایر» را در تصویر زیر مشاهده می‌کنید.

 

فیلتر بایر از ردیف‌های فیلتر سبز-قرمز و سبز-آبی تشکیل شده است. دقت کنید که تعداد سنسورهای سبز در فیلتر بایر دو برابر سنسورهای قرمز و آبی است. دلیل این انتخاب با ساختار چشم و حساسیت بیشتر آن به نور سبز باز می‌گردد. بیشتر بودن تعداد فیلترهای سبز منجر به تولید عکسی با نویز کمتر و جزئیات بیشتر می‌شود.

 

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

 

 

 

منبع


منابع

  1. http://fa.wikipedia.org
  2. http://www.camshop.ir
  3. http://article.tebyan.net
  4. http://newnesh.com

دوربین دیجیتال چیست؟ قسمت 1
دوربین دیجیتال چیست؟ قسمت 2
دوربین دیجیتال چیست؟ قسمت 3

نوامبر 22, 2019/0 دیدگاه /توسط hgadmin
https://behsanandish.com/wp-content/uploads/2019/08/Nikon_D200_front_aka-1.jpg 256 256 hgadmin https://behsanandish.com/wp-content/uploads/2020/09/logo-farsi-englisi-300x195-1.png hgadmin2019-11-22 10:00:112019-11-22 10:00:11دوربین دیجیتال چیست؟ قسمت 3
صفحه 1 از 212

صفحات

  • #9096 (بدون عنوان)
  • #12541 (بدون عنوان)
  • 990729
  • home
  • product-mahdi
  • slider1
  • slider2
  • slider3
  • slider4
  • Video Test
  • آموزش
  • آموزش پردازش تصویر در نرم افزار متلب (Matlab)
  • آموزش های زبان برنامه نویسی سی شارپ (#C)
  • آموزش های زبان سی پلاس پلاس (++C)
  • آموزش های عمومی برنامه نویسی
  • آموزش های عمومی پردازش تصویر و بینایی ماشین
  • آموزش های عمومی هوش مصنوعی
  • ابزار و محصولات جانبی
  • ارتباط با ما
  • استخدام برنامه نویس
  • استخدام برنامه نویس
  • برگه نمونه
  • برگه نمونه
  • برنامه نویسی
  • بینایی ماشین (Machine Vision) و بینایی کامپیوتر
  • پردازش تصویر با کتابخانه متن باز OpenCV
  • پردازش تصویر و بینایی ماشین
  • پروژه ها و سورس کدهای پردازش تصویر و بینایی ماشین
  • پروژه ها و سورس کدهای هوش مصنوعی
  • تست اسلایدر
  • تشخيص پلاک خودرو(Car Plate Recognition)
  • تشخیص نوری کاراکتر و تشخیص دست خط (OCR/HCR)
  • تشخیص هویت زیست سنجی (Biometrics Identification)
  • تماس با ما
  • دانلود نسخه دمو سامانه کنترل تردد بهسان
  • درباره ما
  • درخواست دمو
  • دعوت به همکاری
  • دوربین و ابزارهای تصویربرداری (camera)
  • سامانه جامع پلاکخوان خودرو(کنترل تردد بهسان)
  • سامانه جامع مدیریت باسکول (بهسان توزین)
  • سامانه قرائت فرم های چند گزینه ای
  • سامانه قرائت فرم های چند گزینه ای
  • صفحه اصلی
  • فرم درخواست همکاری
  • محصولات
  • محصولات جانبی
  • مقالات ، سمینارها و کنفرانس های پردازش تصویر
  • مقالات، سمینارها و کنفرانس های هوش مصنوعی
  • نرم افزار باسکول
  • نرم افزار ثبت تردد جاده ای
  • نرم افزار مدیریت تعمیرگاه ، کارواش و تعویض روغن بهسان
  • نرم افزارانبار و حساب داری بهسان اندیش
  • نمونه کارها
  • نمونه کارهای سامانه جامع پلاکخوان خودرو
  • هوش محاسباتی (Computational Intelligence)
  • هوش مصنوعی
  • وبلاگ

دسته ها

  • آموزش پردازش تصویر در نرم افزار متلب (Matlab)
  • آموزش عمومی پردازش تصویر و بینایی ماشین
  • آموزش های زبان برنامه نویسی سی شارپ
  • آموزش های عمومی هوش مصنوعی
  • اخبار
  • بینایی ماشین (Machine Vision) و بینایی کامپیوتر
  • پردازش تصویر با کتابخانه متن باز OpenCV
  • پروژه ها و سورس کدهای پردازش تصویر و بینایی ماشین
  • پروژه ها و سورس کدهای هوش مصنوعی
  • تشخيص پلاک خودرو
  • تشخیص نوری کاراکتر و تشخیص دست خط
  • تشخیص هویت زیست سنجی
  • دسته‌بندی نشده
  • دوربین (camera)
  • مقالات
  • مقالات ، سمینارها و کنفرانس های پردازش تصویر
  • مقالات، سمینارها و کنفرانس های هوش مصنوعی
  • هوش محاسباتی
  • وبلاگ

بایگانی

  • آوریل 2022
  • مارس 2022
  • دسامبر 2021
  • نوامبر 2021
  • سپتامبر 2021
  • جولای 2021
  • می 2021
  • مارس 2021
  • فوریه 2021
  • آوریل 2020
  • مارس 2020
  • فوریه 2020
  • ژانویه 2020
  • دسامبر 2019
  • نوامبر 2019
  • اکتبر 2019
  • سپتامبر 2019
  • آگوست 2019
  • مارس 2019
  • ژانویه 2018
  • دسامبر 2017

تلفن های تماس:

تلفن: ۹۱۰۰۱۸۸۱(۰۳۱)
بازرگانی و فروش:۰۹۱۳۶۵۳۱۸۸۱
پشتیبانی: ۰۹۱۱۷۶۱۰۲۷۵

ساعات کاری

از شنبه تا چهارشنبه : ۰۹:۰۰ تا ۱۷:۰۰

پنچ شنبه ها : از ۰۹:۰۰ تا ۱۳:۳۰

پیوند ها :

  • درخواست دمو
  • مطالب و آموزش ها
  • همکاری با بهسان اندیش
  • درباره ما

 

محصولات :

  • پلاک خوان
  • نرم افزار ثبت تردد جاده ای
  • نرم افزار مدیریت پارکینگ
  • نرم افزار مدیریت کارواش
  • نرم افزار تعمیرگاه خودرو
  • نرم افزار جامع مدیریت باسکول
  • ماژول رله کنترل راهبند
  •  

 

تمامی حقوق مالکیت معنوی این ‌سایت برای شرکت بهسان اندیش سپهر، محفوظ است.
  • Instagram
  • Facebook
  • Youtube
  • LinkedIn
  • Mail
رفتن به بالا