رتبه موضوع:
  • 1 رای - 5 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
پیاده سازی الگوریتم های لبه یابی در #C
#1
الگوریتم sobel

کد پی‌اچ‌پی:
public Bitmap SobelAlgorithm(Bitmap Image)
      {
          Bitmap Result = new Bitmap(Image.WidthImage.Height);
          int temptemp2;
          int[,] SobelHorizontalArray = new int[33]{
                                                       121},
                                                       00 0},
                                                       { -1,-2,-1}
                                                     };
          int[,] SobelVERTICALArray = new int[33]{
                                                       10,-1},
                                                       20,-2},
                                                       1,0,-1}
                                                     };
          for (int i 0Image.Widthi++)
          {
              for (int j 0Image.Heightj++)
              {
                  temp 0;
                  temp2 0;
                  //convolve
                  for (int k 0Image.Width && 3k++)
                  {
                      for (int n 0Image.Height && 3n++)
                      {
                          temp += (Image.GetPixel(kn).SobelHorizontalArray[kn]);
                          temp2 += (Image.GetPixel(kn).SobelVERTICALArray[kn]);
                      }
                  }
                  if (Math.Sqrt(temp temp temp2 temp2) > 129)
                      Result.SetPixel(ijColor.Black);
                  else
                      Result.SetPixel(ijColor.White);
              }
          }
          return Result;
      

الگوریتم sobel بدون استفاده از توابع سیستمی(سریع تر است):
کد پی‌اچ‌پی:
public void SobelAlgorithm()
{
    
int gxgy;
    
int[,] SobelHorizontalArray = new int[33]{
                                                 { 
121},
                                                 { 
00,  0},
                                                 { -
1,-2,-1}
                                               };
 
    
int[,] SobelVERTICALArray = new int[33]{
                                                 { 
10,-1},
                                                 { 
20,-2},
                                                 { 
1,0,-1}
                                               };
    for (
int i 0widthi++)
    {
        for (
int j 0heightj++)
        {
            
gx 0;
            
gy 0;
            
//convolve
            
for (int k 0width && 3k++)
            {
                for (
int n 0height && 3n++)
                {
                    
gx += (image[kn] * SobelHorizontalArray[kn]);
                    
gy += (image[kn] * SobelVERTICALArray[kn]);
                }
            }
            
int temp = (int)Math.Sqrt(gx gx gy gy);
            if (
temp 255)
                
image[ij] = 255;
            else if (
temp 0)
                
image[ij] = 0;
            else
                
image[ij] = temp;
        }
    }

[عکس: matlabOpencv.gif]

« کلاس های آموزش پردازش تصویر با نرم افزار متلب »

جهت کسب اطلاعات بیشتر با شماره تلفن 09130130252 تماس حاصل فرمائید.


«جهت مشاهده سرفصل این دوره کلیک نمایید»
پاسخ
سپاس شده توسط imijoon ، helen.h ، sunnyazi
#2
یه الگوریتم لبه یاب دیگه:
کد پی‌اچ‌پی:
public void PrewittAlgorithm()
{
    
int gxgy;
    
int[,] PrewittHorizontalArray = new int[33]{
                                        { -
1, -1, -1},
                                        { 
00,  0},
                                        { 
1,1,1}
                                      };
 
    
int[,] PrewittVERTICALArray = new int[33]{
                                        { -
10,1},
                                        { -
10,1},
                                        { -
1,0,1}
                                      };
    for (
int i 0widthi++)
    {
       for (
int j 0heightj++)
       {
          
gx 0;
          
gy 0;
          
//convolve
          
for (int k 0width && 3k++)
          {
             for (
int n 0height && 3n++)
             {
                
gx += (image[kn] * PrewittHorizontalArray[kn]);
                
gy += (image[kn] * PrewittVERTICALArray[kn]);
             }
          }
          
int temp = (int)Math.Sqrt(gx gx gy gy);
          if (
temp 255)
             
image[ij] = 255;
          else if (
temp 0)
             
image[ij] = 0;
          else
             
image[ij] = temp;
       }
    }



منبع
[عکس: matlabOpencv.gif]

« کلاس های آموزش پردازش تصویر با نرم افزار متلب »

جهت کسب اطلاعات بیشتر با شماره تلفن 09130130252 تماس حاصل فرمائید.


«جهت مشاهده سرفصل این دوره کلیک نمایید»
پاسخ
سپاس شده توسط imijoon ، helen.h
#3
الگوریتم لبه یاب Roberts :

کد پی‌اچ‌پی:
public void RobertsAlgorithm()
{
    
int gxgy;
    
int[,] RobertsHorizontalArray = new int[22]{
                                        { -
10},
                                        { 
01}
                                      };
 
    
int[,] RobertsVERTICALArray = new int[22]{
                                        { 
0, -1},
                                        { 
1,0}
                                      };
    for (
int i 0widthi++)
    {
       for (
int j 0heightj++)
       {
          
gx 0;
          
gy 0;
          
//convolve
          
for (int k 0width && 2k++)
          {
             for (
int n 0height && 2n++)
             {
                
gx += (image[kn] * RobertsHorizontalArray[kn]);
                
gy += (image[kn] * RobertsVERTICALArray[kn]);
             }
          }
          
int temp = (int)Math.Sqrt(gx gx gy gy);
          if (
temp 255)
             
image[ij] = 255;
          else if (
temp 0)
             
image[ij] = 0;
          else
             
image[ij] = temp;
       }
    }


منبع
[عکس: matlabOpencv.gif]

« کلاس های آموزش پردازش تصویر با نرم افزار متلب »

جهت کسب اطلاعات بیشتر با شماره تلفن 09130130252 تماس حاصل فرمائید.


«جهت مشاهده سرفصل این دوره کلیک نمایید»
پاسخ
سپاس شده توسط manesht ، imijoon ، helen.h
#4
مهدی جان این image چیه ؟ یه new bitmap خالیه ؟
پاسخ
سپاس شده توسط
#5
ماتریس تصویر هست
[عکس: matlabOpencv.gif]

« کلاس های آموزش پردازش تصویر با نرم افزار متلب »

جهت کسب اطلاعات بیشتر با شماره تلفن 09130130252 تماس حاصل فرمائید.


«جهت مشاهده سرفصل این دوره کلیک نمایید»
پاسخ
سپاس شده توسط
#6
یه خورده بیشتر در این مورد توضیح میدی لطفا . من تقریبا همه ش رو فهمیدم بغیر از ماتریس تصویر .
پاسخ
سپاس شده توسط
#7
چون برای لبه یابی به تصویری نیاز داریم که عمل لبه یابی رو روی اون انجام بدیم بنابراین تصویر ورودی در ماتریس image  قرار داده شده.
پست اول رو ویرایش کردم، حالا شاید راحتتر متوجه بشید.البته اینرو هم باید بگم که اینا بخشی از کد هستند و کمی نیاز به تغیرات هست تا اجرا شوند(تابع هستند)
[عکس: matlabOpencv.gif]

« کلاس های آموزش پردازش تصویر با نرم افزار متلب »

جهت کسب اطلاعات بیشتر با شماره تلفن 09130130252 تماس حاصل فرمائید.


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

 

[عکس: ?qa=blob&qa_blobid=2530925190124749573]
 حال ما قصد داریم موقعیتی را که در آن نمودار میزان تغییرات زیادی داشته را نمایش بدیم چون در واقع مشتق برای محاسبه میزان تغییرات مورد استفاده  قرار می گیره. البته بدست آوردن این تغییرات بستگی داره به اینکه شما تا چه فاصله به همسایگی هر نقطه نگاه کنید که اندازه این فاصله در پردازش تصویر تحت عنوان اندازه کرنل هستش.با بدست آوردن مشتق از نمودار بالا  نمودار زیر بدست میاد که شما در وسط تصویر یک ضربه یا peak می بینید.مقدار این نقطه از نمودار از مقادیر همسایگش بیشتره.

[عکس: ?qa=blob&qa_blobid=15985017682911874972]
  
  
 پس میشه نتیجه گرفت زمانی در تصویر لبه وجود داره که تغییرات در سطوح داشته باشیم یا تیره به روشن و یا برعکس. 
 گاهی اوقات در کاربردهایی نیاز هستش که شما فقط لبه های افقی را داشته باشید که باید میزان تغییرات در راستای عمود را محاسبه کنید و گاهی هم به خطوط عمودی نیاز دارید که باید میزان تغییرات در راستای افق را بررسی نماید.
 برای محاسبه مشتق در مقادیر یک بعدی کرنل -2 0 2 را با مقادیر کانولو می کنیم.
  
 برای محاسبه مشتق در راستای افقی (Gx) و عمودی (Gy) هم از کرنل های زیر استفاده کنید.

[عکس: ?qa=blob&qa_blobid=9264669366663972801]

کد:
#include<iostream>
#include<cmath>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;


// Computes the x component of the gradient vector
// at a given point in a image.
// returns gradient in the x direction
int xGradient(Mat image, int x, int y)
{
   return image.at<uchar>(y-1, x-1) +
               2*image.at<uchar>(y, x-1) +
                image.at<uchar>(y+1, x-1) -
                 image.at<uchar>(y-1, x+1) -
                  2*image.at<uchar>(y, x+1) -
                   image.at<uchar>(y+1, x+1);
}

// Computes the y component of the gradient vector
// at a given point in a image
// returns gradient in the y direction

int yGradient(Mat image, int x, int y)
{
   return image.at<uchar>(y-1, x-1) +
               2*image.at<uchar>(y-1, x) +
                image.at<uchar>(y-1, x+1) -
                 image.at<uchar>(y+1, x-1) -
                  2*image.at<uchar>(y+1, x) -
                   image.at<uchar>(y+1, x+1);
}

int main()
{

     Mat src, dst;
     int gx, gy, sum;

     // Load an image
     src = imread("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);
     dst = src.clone();
     if( !src.data )
     { return -1; }


       for(int y = 0; y < src.rows; y++)
           for(int x = 0; x < src.cols; x++)
               dst.at<uchar>(y,x) = 0.0;

       for(int y = 1; y < src.rows - 1; y++){
           for(int x = 1; x < src.cols - 1; x++){
               gx = xGradient(src, x, y);
               gy = yGradient(src, x, y);
               sum = abs(gx) + abs(gy);
               sum = sum > 255 ? 255:sum;
               sum = sum < 0 ? 0 : sum;
               dst.at<uchar>(y,x) = sum;
           }
       }

       namedWindow("final");
       imshow("final", dst);

       namedWindow("initial");
       imshow("initial", src);

     waitKey();


   return 0;
}

منبع
[عکس: matlabOpencv.gif]

« کلاس های آموزش پردازش تصویر با نرم افزار متلب »

جهت کسب اطلاعات بیشتر با شماره تلفن 09130130252 تماس حاصل فرمائید.


«جهت مشاهده سرفصل این دوره کلیک نمایید»
پاسخ
سپاس شده توسط


پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان