کمک در مورد پردارش تصویر با متلب

morteza545

عضو جدید
سلام
دوستانی که در مورد پردازش تصویر با متلب آگاهی های دارند لطفا کمک کنند این برنامه رو بنویسند، که ما هم یاد بگیریم

مهندسين عزيز ميخوام يک رنگ رو توي يک تصوير تشخيص بدم و بعد توي يک صفحه ديکه مکان اون رنگ رو علامت بزارم

اگر نياز هست که بيشتر در موردش توضيح بدم امر بفرماييد

موفق و شاد باشيد
 

morteza545

عضو جدید
عکس مورد نظر

عکس مورد نظر

دوستان این هم عکس مورد نظر که قرار قسمت قرمزش رو تشخیص داده بشه


 

negin17h

مدیر تالارهای مهندسی کامپیوتر و رباتیکمتخصص #C
مدیر تالار
منظورت اینه که میخوای اطراف مربع قرمز رو با تشخیص رنگ علامت بزنی؟ یا میخوای Template Matching انجام بدی؟
 

morteza545

عضو جدید
منظورت اینه که میخوای اطراف مربع قرمز رو با تشخیص رنگ علامت بزنی؟ یا میخوای Template Matching انجام بدی؟

متشکرم که اومدید

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

مثلا بمرکزیت اون قطعه یک علامت ضرب بزاره

....
اگر توضیح بیشتر نیازه بفرمائید
 

negin17h

مدیر تالارهای مهندسی کامپیوتر و رباتیکمتخصص #C
مدیر تالار
به نظرم تصوير رو با استفاده از imread بخونید، بعد هم تبديل به ماتريسی از اعداد کنيد. مثلاً با rgb2ind میتونید رنگ ها را به ايندکس تبديل کنيد و مدل های ديگر تبديل تصوير به ماتريس. از روی ماتريس بدست آمده به راحتی ميتونيد رنج قرمز رو تشخيص بديد :gol:
 

beginner2001

عضو جدید
برای بررسی پیکسل به پیکسل میتوننی از قطعه کد زیر استفاده کنین



کد:
 private void Search_Color()
        {
            
            if (Back_Color == 0)
                Background_Color();
           
            bool[,] serached = new bool[bmp.Height, bmp.Width];

            for (int i = 0; i < bmp.Height; i++)
            {
                for (int j = 0; j < bmp.Width ; j++)
                {
                    int pix = 0;
                    pix =  bmp.GetPixel(j,i).ToArgb();
                    int ekhtel = Ekhtelaf(pix);
                    if (serached[i, j] == false && pix != Back_Color && pix != Back_Color1 && pix != Back_Color2)
                    if (serached[i, j] == false && (pix != Back_Color && !(pix - Back_Color <= ekhtel && pix - Back_Color >= 0)))
                    {
                       
                        Search_right(pix,i,j, ref serached);

                    }
                }
حالا جستجو رو از سمت راست شروع میکنیم :
 
آخرین ویرایش:

beginner2001

عضو جدید
حالا جستجو رو از سمت راست شروع میکنیم :

کد:
private void Search_right(int pixel, int row , int col, ref bool[,] searched)
        {
                     Point P1, P2;
            int Rast=0, Chap=0, Paeen=0, Bala = 0;
            int i = row , j = col;
            P1 = new Point(row,col);
            int ekhtel = Ekhtelaf(pixel);
            for (; (j < bmp.Width && (bmp.GetPixel(j, i).ToArgb() == pixel || (bmp.GetPixel(j, i).ToArgb() - pixel <= ekhtel && bmp.GetPixel(j, i).ToArgb() - pixel >=0 ))); j++)
            {
                    Rast++;
                    searched[i, j] = true;
            }
                        j--;
            Paeen = Search_Down(pixel ,ref i ,ref j , ref searched);
            P2 = new Point(i, j);
            Chap = Search_Left(pixel,ref i,ref j, ref searched);
            Bala = Search_UP(pixel, ref i, ref j, ref searched);

            int avg = (Bala + Paeen + Chap + Rast) / 4;

            if (avg >= 9 && Bala >= 9 && Paeen >= 9 && Chap >= 9 && Rast >= 9)
            {
                int avg_amodi, avg_ofoghi;
                avg_amodi = (Bala + Paeen) / 2;
                avg_ofoghi = (Chap + Rast) / 2;
                if (((avg_amodi - Bala) >= -50 && (avg_amodi - Bala) <= 50) && ((avg_amodi - Paeen) >= -50 && (avg_amodi - Paeen) <= 50) && ((avg_ofoghi - Chap) >= -50 && (avg_ofoghi - Chap) <= 50) && ((avg_ofoghi - Rast) >= -50 && (avg_ofoghi - Rast) <= 50))
                {
                    sbp_point[Count_Rectangle] = new SBP_Point();
                    sbp_point[Count_Rectangle].Point_Start = P1;
                    sbp_point[Count_Rectangle].Point_Finish = P2;

                    Count_Rectangle++;
                    Searched_into_rect(P1, P2, ref searched);
                }
            }
            
        }
        
        private int Search_Down(int pixel, ref int row,ref int col, ref bool[,] searched)
        {
            int paeen = 0;
            int i = row, j = col;
            int ekhtel = Ekhtelaf(pixel);
            try
            {
                for (; (i < bmp.Height && (bmp.GetPixel(j, i).ToArgb()) == pixel || (bmp.GetPixel(j, i).ToArgb() - pixel <= ekhtel && bmp.GetPixel(j, i).ToArgb() - pixel >= 0)); i++)
                {
                    paeen++;
                    searched[i, j] = true;
                }
            }
            catch (Exception ex) { }
            finally
            {
                i--;
                row = i;
                col = j;
            }
            return paeen;
        }

        private int Search_Left(int pixel,ref int row, ref int col, ref bool[,] searched)
        {
            int chap = 0;
            int i = row, j = col;
            int ekhtel = Ekhtelaf(pixel);
            try
            {
                for (; (j > 0 && (bmp.GetPixel(j, i).ToArgb()) == pixel || (bmp.GetPixel(j, i).ToArgb() - pixel <= ekhtel && bmp.GetPixel(j, i).ToArgb() - pixel >= 0)); j--)
                {

                    chap++;
                    searched[i, j] = true;

                }
            }
            catch (Exception ex)
            {
                
            }
            finally
            {
                j++;
                row = i;
                col = j;
            }
            return chap;
        }
        private int Search_UP(int pixel,ref int row,ref int col, ref bool[,] searched)
        {
            int bala = 0;
            int i = row, j = col;
            int ekhtel = Ekhtelaf(pixel);
            try
            {
                for (; (i > 0 && ((bmp.GetPixel(j, i).ToArgb()) == pixel) || (bmp.GetPixel(j, i).ToArgb() - pixel <= ekhtel && bmp.GetPixel(j, i).ToArgb() - pixel >= 0)); i--)
                {
                    bala++;
                    searched[i, j] = true;
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
               i++;
                row = i;
                col = j;
            }
            return bala;
        }

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

negin17h

مدیر تالارهای مهندسی کامپیوتر و رباتیکمتخصص #C
مدیر تالار
دوست عزیز کدهایی که شما نوشتید MATLAB نیست. ایشون با MATLAB میخواستن :gol:
 

morteza545

عضو جدید
برای بررسی پیکسل به پیکسل میتوننی از قطعه کد زیر استفاده کنین


حالا جستجو رو از سمت راست شروع میکنیم :

متشکر که زحمت کشیدید اول بگید باچی نوشتی ؟ مثل # c بود

برسی پیکسل به پیکسل روش خوبه هست یا از لبه یابی استفاده کنیم ؟؟؟؟

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

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

باز هم متشکرم:w14:
 

negin17h

مدیر تالارهای مهندسی کامپیوتر و رباتیکمتخصص #C
مدیر تالار
دوست عزیز لبه یابی لبه ها را پيدا می کنه. میتونه مربع رو پيدا کنه اما اینکه قرمز باشه یه بحث دیگه است. الگوریتم های لبه یابی مثل کنی بر روی تصویر باینری کار میکنه :gol:
 

morteza545

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

مهندس جان ممکنه خودتون یه نمونه بنویسید :sweatdrop:
 

beginner2001

عضو جدید
دوست عزیز کدهایی که شما نوشتید MATLAB نیست. ایشون با MATLAB میخواستن :gol:

بله کاملا حق با شماست الگوریتم جستجو برای متلب به صورت زیر میشه
کد:
function []=find_near(image) 
i=im2double(imread(image));%read image
imtool(i)                  %show original image
b1=i(:,:,3);
bw=im2bw(b1,.5);
imtool(bw)                 
[L,num] = bwlabel(bw,8);
s  = regionprops(L, 'centroid');
centroids = cat(1, s.Centroid);
for i=1:1:num
    a(i)=sqrt((centroids(i,1)-240)*(centroids(i,1)-240)+(centroids(i,2)-360)*(centroids(i,2)-360));
end
    c = (a==min(a));
    j = size(a);
    b = [ 1:j(2) ];
    r=b.*c;
    d = r(r>0);
    x=centroids(d,1)
    y=centroids(d,2)

متشکر که زحمت کشیدید اول بگید باچی نوشتی ؟ مثل # c بود

برسی پیکسل به پیکسل روش خوبه هست یا از لبه یابی استفاده کنیم ؟؟؟؟

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

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

باز هم متشکرم

به زبان c++ و در محیط نت بینز نوشته شده

من خودم جستجوی پیکسل به پیکسل رو در بیشتر مواقع ترجیح میدم اما Edge detection هم کاربردهای خاص خودو داره مثل پردازش تصویر صورت

این کدها ایده ای از جستجو بود برای پیدا کردن مکانی بخصوص

ورنگ شما برای تشخیص به صورت RED 255, GREEN 0 BLUE 0)
 

morteza545

عضو جدید
متشکر از زحمتی که کشیدید
لطف کنید و یه توضیح در مورد برنامه بدین.....:w42:

(اگر میشه خیلی کلی نگین که ماهم متوجه بشیم)

موفق و شاد باشید
:w27:
 

beginner2001

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

aabedeni

عضو جدید
سلام .ببخشید میشه منو راهنمایی کنید .چطور میتونم تابع resize (که توی متلب هست ) ، با عملگرهای ریاضی برام تشریح کنید ؟
 

nima93

عضو جدید
سلام

به این سایت هم سر بزنید کتاب های آموزشی خوبی در زمینه پردازش تصویر در متلب قرار دادن

http://www.matlabdl.com/
 
آخرین ویرایش:

Similar threads

بالا