# مهندسی نرم افزار > مباحث مرتبط با مهندسی نرم‌افزار > پردازش تصویر (Image Processing) >  آموزش پردازش تصویر از پایه در C#‎

## EhsanHejazi

جلسه ی اول:آشنایی با نحوه ی وارد کردن تصویر در C#‎‎‎‎‎‎‎‎‎‎‎‎
 سلام خدمت دوستان خوبم،در این تاپیک به آموزش پردازش تصویر در C#‎ از پایه  می پردازیم. امیدوارم که آموزش رو به طور مستمر دنبال کنید و  براتون مفید باشه...
اول یک PictureBox به فرم اضافه می کنیم سپس برای نمایش یک فایل گرافیکی ما شئ  Bitmap استفاده می کنیم به صورت زیر:

Bitmap bmp = new Bitmap("آدرس عکس");

pictureBox1.Image = bmp; 
اکنون برنامه را اجرا کنید . می بینید که تصویر مورد نظر فراخوانی و در PictureBox  نمایش داده شده است.
برخی از ویژگی های کلاس PictureBox
ClienRectangle  :کادر مشخص کننده محدوده کنترل (بدون در نظر گرفتن نوارهای لغزان , حاشیه ها , نوار عنوان و...)
Image : مشخص کننده کلاس Image  که در بردارنده تصویری است که نمایش داده میشود.
SizeMode :تعیین نحوه نمایش تصویر.

----------


## EhsanHejazi

جلسه 2:انجام تغییرات روی پیکسل ها بدون استفاده از اشاره گر ها
در ابتدا به این نکته دقت کنید که برای پردازش تصویر در C#‎‎‎ بایستی برای دسترسی به سرعت بالا از اشاره گر ها استفاده کنید ولی در ابتدا من این کار رو انجام نمی دهم تا در ابتدا به طور کلی با پردازش تصویر آشنا شوید و سپس وارد کار با اشاره گر ها خواهیم شد.
برای دریافت رنگ یک پیکسل دلخواه از getpixel به صورت زیر استفاده می کنیم. 
BMP.GetPixel(x, y);
برای تنظیم رنگ یک نقطه یا پیکسل هم به صورت زیر استفاده می کنیم.
BMP.SetPixel(x, y, (red,green,blue));

رنگ پیکسلی را که با دستور get pixel به دست می آید می توان با فرمول زیر رنگ های آبی , قرمز , سبز را تفکیک کرد.
r = color % 256 ;
g =  ( color % ( 256 * 256 ) ) / 256 ;

b = color / ( 256 * 256 ) ;
البته در #c یک شئ Color وجود دارد که می تواند خود رنگهای اصلی را تفکیک بدهد.
Color col;  r = col.R;  g = col.G;  b = col.B;

----------


## EhsanHejazi

جلسه3:طریقه ی پیمایش تمام پیکسل های تصویر
یکی از کارهای مهم که در پردازش تصویر انجام می شود نحوه پیمایش یک شئ گرافیکی می باشد , که نحوه دسترسی به اجزا یا پیکسل های یک تصویر برای تحلیل و پیاده سازی الگوریتم ها ی خود بر روی تصاویر می باشد. همانطور که می دانید تصاویر ما دو بعدی هستند پس ما دارای دو بردار X,Y برای تعیین مختصات داریم.

برای پیمایش یک شئ گرافیکی در زبان C#‎‎‎‎‎‎‎‎‎‎‎‎‎ روشهای مختلفی وجود دارد که ما در اینجا فعلا یک روش را به شما معرفی می کنیم.
Color col;
for (int i = 0; i < Int32.Parse(BMP.Width.ToString()); i++)
{
for (int j = 0; j < Int32.Parse(BMP.Height.ToString()); j++)
{
col = BMP.GetPixel(i, j);
BMP.SetPixel(i, j, Color.FromArgb(RGBست کردن رنگ دلخواه بر اساس ));
}
}

----------


## EhsanHejazi

جلسه4:نگاتیو کردن عکس
یکی از ساده ترین فیلتر ها در پردازش تصویر فیلتر نگاتیو کردن می باشد.به وسیله ی این فیلتر مقدار رنگ قرمز،سبز و آبی هر پیکسل از عدد 255 کم می شود و در اصطلاح عکس نگاتیو می شود.برای اجرای این فیلتر روی عکس با استفاده از دو حلقه for شروع به پیمایش در تصویر می کنیم و رنگ هر پیکسل را با استفاده از دستور getpixel دریافت می کنیم و پس از آن به وسیله ی دستور setpixel رنگ هر پیکسل را از 255 کم کرده و به آن پیکسل اعمال می کنیم:
public Bitmap interval(Bitmap BMP){
Color col;
for (int i = 0; i < Int32.Parse(BMP.Width.ToString()); i++)
{
for (int j = 0; j < Int32.Parse(BMP.Height.ToString()); j++)
{
col = BMP.GetPixel(i, j);
BMP.SetPixel(i, j, Color.FromArgb(255 - col.R, 255 - col.G, 255 - col.B));
}
}
return BMP;
}

----------


## EhsanHejazi

جلسه5:فیلتر تنظیم روشنایی و فیلتر سیاه سفید
 فیلتر تنظیم روشنایی:

            Bitmap BMP = new Bitmap("adress of picture");
            Color col;
            int r, g, b;
            for (int i = 0; i < Int32.Parse(BMP.Width.ToString()); i++)
            {
                for (int j = 0; j < Int32.Parse(BMP.Height.ToString()); j++)
                {
                    col = BMP.GetPixel(i, j);
                    r = Int32.Parse(hScrollBar1.Value.ToString()) + col.R;
                    g = Int32.Parse(hScrollBar1.Value.ToString()) + col.G;
                    b = Int32.Parse(hScrollBar1.Value.ToString()) + col.B;
                    if (r > 255)
                        r = 255;
                    else if (r < 0)
                        r = 0;
                    if (g > 255)
                        g = 255;
                    else if (g < 0)
                        g = 0;
                    if (b > 255)
                        b = 255;
                    else if (b < 0)
                        b = 0;
                    BMP.SetPixel(i, j, Color.FromArgb(r, g, b));
                    pictureBox2.Image = BMP;
                }
            }
در برنامه ی بالا از یک اسکرول بار استفده شده است و عدد آن به مقدار رنگ هر پیکسل اضافه یا کم می شود و اگر مقدار رنگ از 255 بیشتر شدT، عدد 255 و اگر از صفر کمتر شد، عدد 0 به عنوان رنگ پیکسل در نظر گرفته می شود.


فیلتر سیاه سفید:
Bitmap BMP = new Bitmap("adress of picture");
            Color col;
            int r, g, b, rgb;
            byte blue, green, red;
            for (int i = 0; i < Int32.Parse(BMP.Width.ToString()); i++)
            {
                for (int j = 0; j < Int32.Parse(BMP.Height.ToString()); j++)
                {
                    col = BMP.GetPixel(i, j);
                    blue = col.B;
                    green = col.G;
                    red = col.R;
                    if (red < 128)
                    {
                        BMP.SetPixel(i, j, Color.FromArgb(0, 0, 0));  
                    }
                    if (red >= 128)
                    {
                        BMP.SetPixel(i, j, Color.FromArgb(255, 255, 255));
                    }
                }
            }
            pictureBox2.Image = BMP;
اگز مقدار رنگ پیکسل از 128 بیشتر بود،پیکسل به رنگ سفید و اگر کمتر بود، به رنگ سیاه در خواهد آمد.

----------


## mortezamsp

من قبلن قبنا یه عالمه از این کدها نوشته بودم برای تغییر دادن تصاویر تو سی شارپ.
مثلا افکت های هنری مثل oilpainting و موزتئیک و کارهای ساده دیگه و کانولوشن و لبه یابی و اینا...
اینها رو برای دانلود گذاشتم اینجا شاید بدردتون خورد.
البته پیشنهاد میکنم کتابخانه AFORGE رو دانلود کنید که کد بازه خیلی از کدهارو میتونید از اونجا کمک بگیرید.

----------


## saeid.71

ببخشید مورد Crop کردن عکس هم یه توضیحی میدید ؟!
چطوری میشه قسمتی از عکس مثلا از  (5,5) تا (20,20) رو انتخاب کرد و تویه picturebox نشون داد؟

----------


## mahsa_hashemi

> من قبلن قبنا یه عالمه از این کدها نوشته بودم برای تغییر دادن تصاویر تو سی شارپ.
> مثلا افکت های هنری مثل oilpainting و موزتئیک و کارهای ساده دیگه و کانولوشن و لبه یابی و اینا...
> اینها رو برای دانلود گذاشتم اینجا شاید بدردتون خورد.
> البته پیشنهاد میکنم کتابخانه AFORGE رو دانلود کنید که کد بازه خیلی از کدهارو میتونید از اونجا کمک بگیرید.


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

----------


## mortezamsp

مثلا این تابع :  static public string edge(string filename) که در فایل edge.cs هست، آدرس یک فایل بیت مپ رو میگیره و تصویر لبه یابی شده رو تو یه فایل بیت مپ ذخیزه میکنه و اسم اون رو برمیگردونه.
یا مثلا تابع public static Bitmap ApplyFilter(ref Bitmap image, int[,] filter, int filtersize, int filterZarib) تو فایل filters.cs یک رفرنس به بیت مپ میگیره و یک آرایه دوبعدی که اون رو روی تصویر کانولو میکنه. و اندازه ماتریس و ضریب اون.
نمیدونم اگه به کد نگاه کنین راحت میفهمین...

----------


## HadiVB

آقا خوب داری پیش میری ادامه بده

----------


## mohammadi2007

خیلی ممنون توضیحات خیلی خوبی بود امیدوارم در کارهایتان موفق باشد و اجرکمم عند الله :لبخند:

----------


## modern_amin

دلیل جواب ندادن این کد چیه


private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
Color k1;
int i1;
k1 = picture.GetPixel(e.X, e.Y);
i1=(k1.B+k1.R+k1.G)/3;
MessageBox.Show(Convert.ToString(i1));
}

----------


## manij_mhm

> دلیل جواب ندادن این کد چیه
> 
> 
> private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
> {
> Color k1;
> int i1;
> k1 = picture.GetPixel(e.X, e.Y);
> i1=(k1.B+k1.R+k1.G)/3;
> ...


شما کد رو به صورت زیر  تغییر بدید:

            Color k1;
            int i1;
            k1 =((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y);
            i1 = (k1.B + k1.R + k1.G) / 3;
            MessageBox.Show(Convert.ToString(i1));

----------


## krash6

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

----------


## unkown

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

----------


## mohsenmoridy

سلام اگه بخوایم تمام کدهای رنگ هر پیکسل در یک تصویر رو داشته باشیم باید چکار کنیم ممنون می شم کدش رو بنویسید

----------


## farbehar1

سلام ، ببخشید که تاپیک رو بالا میارم ، ممنون از توضیحات . 
چطور میشه مختصات یک شی (مثلا یک دایره ) رو در تصویر بدست آورد ؟

----------


## hesarak

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

----------


## hizha1234

سلام ببخشید من می خوام یه عکس تو فرم لود کنم بعد تابعی بنویسم دوعدد تصادفی تولید کنه واون دوعدد در حکم مختصاتxوy, پیکسل روی عکس رو به من نشون بده و اطلاعات rgbرو هم نمایش بده لطفا مرا راهنمایی بفرمایید.

----------


## nadia92

ممنون استفاده کردم

----------


## amirhosseinn

> من قبلن قبنا یه عالمه از این کدها نوشته بودم برای تغییر دادن تصاویر تو سی شارپ.
> مثلا افکت های هنری مثل oilpainting و موزتئیک و کارهای ساده دیگه و کانولوشن و لبه یابی و اینا...
> اینها رو برای دانلود گذاشتم اینجا شاید بدردتون خورد.
> البته پیشنهاد میکنم کتابخانه AFORGE رو دانلود کنید که کد بازه خیلی از کدهارو میتونید از اونجا کمک بگیرید.


استاد فایل ضمیمش یا فایل هایی ک برای دانلود گفتید کجاست چطوری باید دانلودشون کنم ؟؟

----------

