PDA

View Full Version : سوال: پیدا کردن دایره ی توپر(تشخیص پیکسل ها)



ramezani1988
شنبه 28 فروردین 1389, 09:24 صبح
سلام
من یه پروژه دارام طراحی میکنم که می خوام یه تصویر باز بشه و از چهارتا دایره ی کنار هم تشخیص بده کدوم پره و بعد شماره ی دایره رو برگردونه
اندازه ی فاصله ی دایره ها با هم برابره
اندازه ی هر دایره 35در35 و فاصله مرکزشون به صورت افقی از هم 66.5 پیکسله
دوستان عزیز اگه نمونه کد بذارید ممنون می شم

saed2006
شنبه 28 فروردین 1389, 09:33 صبح
اندازه و مکان دایره ها همیشه ثابت هست؟

ramezani1988
شنبه 28 فروردین 1389, 10:11 صبح
اندازه و مکان دایره ها همیشه ثابت هست؟

بله همیشه ثابت هست.

Shahram_Shobeiri
شنبه 28 فروردین 1389, 10:30 صبح
Private Checked As Boolean(,)
Public Sub MagicSelector(ByRef Img As Bitmap, ByVal x As Integer, ByVal y As Integer _
, ByVal Red As Byte, ByVal Blue As Byte, ByVal Green As Byte, Optional ByVal ReturnList As Boolean = False _
, Optional ByRef Points As ArrayList = Nothing)
Dim bmpData As New Imaging.BitmapData
Dim rgbValues(0) As Byte
Dim Bytes As Int64 = Img.Width * Img.Height * 4
LockBitmapBits(Img, 0, 0, Img.Width, Img.Height, rgbValues, bmpData, Bytes)


Dim Que As New Queue(Of Point)
Dim p As Point

p = New Point(x, y)
Que.Enqueue(p)

While Que.Count > 0
p = Que.Dequeue()
x = p.X
y = p.Y
Checked(x, y) = True

Dim pp As Integer = (y * Img.Width + x) * 4
If rgbValues(pp) = Blue AndAlso rgbValues(pp + 1) = Green AndAlso rgbValues(pp + 2) = Red Then
rgbValues(pp) = 255 - Blue 'Blue
rgbValues(pp + 1) = 255 - Green 'Green
rgbValues(pp + 2) = 255 - Red 'Red

If ReturnList Then Points.Add(p) : Checked(x, y) = True

If y > 0 AndAlso Not Checked(x, y - 1) Then Que.Enqueue(New Point(x, y - 1)) : Checked(x, y - 1) = True
If x < Img.Width - 1 AndAlso Not Checked(x + 1, y) Then Que.Enqueue(New Point(x + 1, y)) : Checked(x + 1, y) = True
If y < Img.Height - 1 AndAlso Not Checked(x, y + 1) Then Que.Enqueue(New Point(x, y + 1)) : Checked(x, y + 1) = True
If x > 0 AndAlso Not Checked(x - 1, y) Then Que.Enqueue(New Point(x - 1, y)) : Checked(x - 1, y) = True
End If
End While
UnlockBitmapBits(Img, rgbValues, bmpData, Bytes)
End Sub
با استفاده از متد فوق می تونید پیکسل های هم رنگ کنار هم را در یک تصویر تشخیص بدید. کافیه که این متد رو برای یک نقطه داخل 4 دایره اجرا کرده و دایره ای رو که بیشترین نقطه رو به عنوان خروجی برگردوند به عنوان دایره تو پر انتخاب کنید.
البته کدش vb.net است. زحمت تبدیل به c# و قرار دادن اون در این تاپیک رو هم لطفاً خودتون بکشید.

mohammad meta
شنبه 28 فروردین 1389, 11:14 صبح
آقا راه خیلی راحت :
اگه تصویر در مکان ثابتی قرار داره بوسیله 1 نقطه در داخل یکی از دایره ها 3 نقطه دیگر درون سه دایره دیگر پیدا کن البته این نقاط نقطه مرکز هر دایره باشد . بعد رنگ هر کدام را با رنگ پر کننده دایره ها مقایسه کن
هرکدام سفید بود دایره تو خالی در غیر این صورت تو پر.

oshnood
شنبه 28 فروردین 1389, 13:52 عصر
آقا راه خیلی راحت :
اگه تصویر در مکان ثابتی قرار داره بوسیله 1 نقطه در داخل یکی از دایره ها 3 نقطه دیگر درون سه دایره دیگر پیدا کن البته این نقاط نقطه مرکز هر دایره باشد . بعد رنگ هر کدام را با رنگ پر کننده دایره ها مقایسه کن
هرکدام سفید بود دایره تو خالی در غیر این صورت تو پر.
دوست عزيز ميشه يه نمونه كد بذاري؟؟؟

reza ghorbani
شنبه 28 فروردین 1389, 15:10 عصر
دایره ها ممکنه تو در تو باشه؟
اگه تو در تو باشه راه حل این دوستمون جواب نمی ده چون در اون صورت نقطه ای رو که در نظر گرفتیم ممکنه رو هر دایره ای بیافته.

oshnood
شنبه 28 فروردین 1389, 15:43 عصر
الان رواین سیستم vs ندارم این توضیح میدم اگه نتونستی براتون مینویسم .

ممنون ميشم اگه اينكارو بكنيد.شديدا نياز دارم .منتظرتونم

mohammad meta
شنبه 28 فروردین 1389, 17:28 عصر
دایره ها ممکنه تو در تو باشه؟
اگه تو در تو باشه راه حل این دوستمون جواب نمی ده چون در اون صورت نقطه ای رو که در نظر گرفتیم ممکنه رو هر دایره ای بیافته.
دوست عزیز اول صورت سوال خوب بخون بعد نظر بده . تو صورت سوال نوشته دایره ها به فاصله یکسان از یکدیگر قرار دارد .:بامزه:

mohammad meta
شنبه 28 فروردین 1389, 18:42 عصر
توی هر دایره که click کنی میگه خالی یا پر .
پس اگه 1 نقطه داخل هر دایره پیدا کنی همیشه معلوم کدوم پر کدوم خالی
برنامه زیر را دانلود کن :
47208
موفق باشی

ramezani1988
یک شنبه 29 فروردین 1389, 09:55 صبح
توی هر دایره که click کنی میگه خالی یا پر .
پس اگه 1 نقطه داخل هر دایره پیدا کنی همیشه معلوم کدوم پر کدوم خالی
برنامه زیر را دانلود کن :
47208
موفق باشی

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

ramezani1988
یک شنبه 29 فروردین 1389, 10:34 صبح
توی هر دایره که click کنی میگه خالی یا پر .
پس اگه 1 نقطه داخل هر دایره پیدا کنی همیشه معلوم کدوم پر کدوم خالی
برنامه زیر را دانلود کن :
47208
موفق باشی دوست عزیز می خوام یه تصویر رو باز کنم بعد روی اون این تصویر پردازش رو انجام بدم
کد:
private void button1_Click(object sender, EventArgs e)
{
int k=0;
Bitmap mybit = (Bitmap)Image.FromFile("D:\\Un-2.jpg");
for (int i = 18; i <= 157; i += 45)
{
MessageBox.Show("حلقه");
k = k + 1;
if (mybit.GetPixel(i, 255) == Color.FromArgb(0, 0, 0))
MessageBox.Show("fff");
}

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

ramezani1988
یک شنبه 29 فروردین 1389, 11:07 صبح
از همه دوستان متشکرم مشکلم حل شد.کدشم در آینده نزدیک میذارم

mohammad meta
یک شنبه 29 فروردین 1389, 11:13 صبح
دوست عزیز می خوام یه تصویر رو باز کنم بعد روی اون این تصویر پردازش رو انجام بدم
کد:
private void button1_Click(object sender, EventArgs e)
{
int k=0;
Bitmap mybit = (Bitmap)Image.FromFile("D:\\Un-2.jpg");
for (int i = 18; i <= 157; i += 45)
{
MessageBox.Show("حلقه");
k = k + 1;
if (mybit.GetPixel(i, 255) == Color.FromArgb(0, 0, 0))
MessageBox.Show("fff");
}

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

دوست عزیز هر سیاهی که پارسی کولا نیست :لبخند: rgb = (0,0,0) آخرین سیاه در جدول رنگِ . احتمالا اون سیاه 0,0,1 . ابتدا باید اطمینان داشته باشی که رنگ پیکسل سیاه0و0و0و
شما اگر از عکس اسکن شده استفاده می کنی باید محدوده رنگ تعریف کنی.
مثلا از خاکستری تیره به بالا را سیاه در نظر بگیری .

مصطفی ساتکی
دوشنبه 30 فروردین 1389, 13:15 عصر
خلاصه یه چیزی می گم دیه کشش ندید.
اگر لبه رو میخاین پردازش کنین .لبه Canny و سپس Hough دایره رو اعمال کنید.
اگر مایلید تو فضای pattern کار کنید threshold Otso رو استفاده کنید و سپس با هشت خونه مجاور کلیه آبجکت ها (دایره ها( رو trace کنید تا زمانیکه چیزی تو صفحه نباشه .
برای از بین بردن نویز در روش اول sigma رو عددی بالاتر از 1 انتخاب کنید و در حالت دوم برای از بین بردن نویز از Opening مربوط به morphology استفاده کنید.
مزیت روش دوم به اول که با NN می شه هر object به غیر از دایره رو هو شناسایی کرد