PDA

View Full Version : آموزش پردازش تصویر از پایه در C#



EhsanHejazi
سه شنبه 15 فروردین 1391, 23:27 عصر
جلسه ی اول:آشنایی با نحوه ی وارد کردن تصویر در C#‎‎‎‎‎‎‎‎‎‎‎
سلام خدمت دوستان خوبم،در این تاپیک به آموزش پردازش تصویر در C# از پایه می پردازیم. امیدوارم که آموزش رو به طور مستمر دنبال کنید و براتون مفید باشه...
اول یک PictureBox به فرم اضافه می کنیم سپس برای نمایش یک فایل گرافیکی ما شئ Bitmap استفاده می کنیم به صورت زیر:
http://uploadkon.ir/uploads/322d8f99bb75ee15feb003fe117c3a3f.jpg
Bitmap bmp = new Bitmap("آدرس عکس");

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

EhsanHejazi
سه شنبه 15 فروردین 1391, 23:35 عصر
جلسه 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
چهارشنبه 16 فروردین 1391, 22:21 عصر
جلسه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
جمعه 18 فروردین 1391, 22:52 عصر
جلسه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;
}
http://uploadkon.ir/uploads/70bc73b4d6c2cf92df4ea84ccb959715.pnghttp://uploadkon.ir/uploads/8984eaa9c05bd93f0bfacea4c3a67305.png

EhsanHejazi
دوشنبه 21 فروردین 1391, 22:37 عصر
جلسه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 به عنوان رنگ پیکسل در نظر گرفته می شود.
http://uploadkon.ir/uploads/70bc73b4d6c2cf92df4ea84ccb959715.png
http://uploadkon.ir/uploads/138410472c2bd2d294567f95a156161b.png
فیلتر سیاه سفید:
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 بیشتر بود،پیکسل به رنگ سفید و اگر کمتر بود، به رنگ سیاه در خواهد آمد.
http://uploadkon.ir/uploads/b04cd879c419b0a614b5e7c84c9fb1cd.png

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

saeid.71
جمعه 25 فروردین 1391, 12:27 عصر
ببخشید مورد Crop کردن عکس هم یه توضیحی میدید ؟!
چطوری میشه قسمتی از عکس مثلا از (5,5) تا (20,20) رو انتخاب کرد و تویه picturebox نشون داد؟

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

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

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

HadiVB
پنج شنبه 08 تیر 1391, 18:29 عصر
آقا خوب داری پیش میری ادامه بده

mohammadi2007
جمعه 09 تیر 1391, 11:47 صبح
خیلی ممنون توضیحات خیلی خوبی بود امیدوارم در کارهایتان موفق باشد و اجرکمم عند الله:لبخندساده:

modern_amin
دوشنبه 23 اردیبهشت 1392, 10:04 صبح
دلیل جواب ندادن این کد چیه


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
پنج شنبه 02 خرداد 1392, 14:45 عصر
دلیل جواب ندادن این کد چیه


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));
}


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


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
یک شنبه 03 خرداد 1394, 19:35 عصر
سلام
خسته نباشید
اگه بخواییم تو یه عکسه سیاهو سفید که دو یا سه تیکه سفید داره، پیکسل تیکه های سفیدو جدا جد ا بدست بیاریم چیکار باید کرد؟؟؟؟؟؟؟؟؟؟:گریه:
کلشو بدست آوردم جداگونش مونده
پلیززززززز کمک کنید

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

mohsenmoridy
جمعه 08 آبان 1394, 01:06 صبح
سلام اگه بخوایم تمام کدهای رنگ هر پیکسل در یک تصویر رو داشته باشیم باید چکار کنیم ممنون می شم کدش رو بنویسید

farbehar1
سه شنبه 29 دی 1394, 17:44 عصر
سلام ، ببخشید که تاپیک رو بالا میارم ، ممنون از توضیحات .
چطور میشه مختصات یک شی (مثلا یک دایره ) رو در تصویر بدست آورد ؟

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

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

nadia92
سه شنبه 31 مرداد 1396, 14:15 عصر
ممنون استفاده کردم

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

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