2015-07-27 36 views
0

позволяет сказать, что у меня есть изображение enter image description hereC# получить прямоугольник рамки с изображением

я хотел бы найти черный прямоугольник рамки (справа, слева, ширина, высота) в изображении (позволяет сказать, что нет никаких других черных пикселей в это изображение). мой код до сих пор:

private unsafe Bitmap GetDiffBitmap(Bitmap bmp) 
     { 


      bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadOnly, bmp.PixelFormat); 

      IntPtr scan0 = bmData.Scan0; 


      int stride = bmData.Stride; 


      int nWidth = bmp.Width; 
      int nHeight = bmp.Height; 

      for(int y = 0; y < nHeight; y++) 

      { 
       //define the pointers inside the first loop for parallelizing 
       byte* p = (byte*)scan0.ToPointer(); 
       p += y * stride; 



       for (int x = 0; x < nWidth; x++) 
       { 
        //always get the complete pixel when differences are found 

        if(p[0]==0 && p[1]==0 && p[2]==0) 
        { 
          // p[0] = 255; 
          // p[1] = 255; 
          // p[2] =255; 

          right = nWidth;//geting the position of the lastest black pixel; 

         } 



        p += 4; 


       } 

      } 



      bmp.UnlockBits(bmData); 


      return bmp; 
     } 

его, кажется, как мой nwidth также как изображение по ширине, так ее не работает .. я получил-доступ к этим пикселей, и я могу изменить их, но я не знаю, почему я могу сосчитать и найти правильные границы черного прямоугольника ... если кто-то может мне помочь я бы действительно apperciate его,

ответ

0

Есть несколько проблем с этим видом анализа изображений:

1 заменить

if(p[0]==0 && p[1]==0 && p[2]==0) 
{ 
    right = nWidth;//geting the position of the lastest black pixel; 
} 

с

if(p[0]==0 && p[1]==0 && p[2]==0) 
{ 
    right = x; //geting the position of the lastest black pixel; 
} 

Ваша переменная х-итерация уже подсчитывает, какой пиксель вы находитесь.

2 Код, который вы указали, работает только для 32-битных пиксельных форматов. Если это специально, вы должны проверить, находится ли битмап, который вы анализируете, в совместимом формате.

3 С большинством сжатых форматов изображений вы часто не получите ровно 0 на всех трехцветных каналах для черных, вместо нуля вы должны сделать «меньше, чем что-то темное».

+0

да .. глупая ошибка .. пришлось использовать 'x' вместо' nWidth' ... tnx. –

+0

и что вы имели в виду вместо нуля? @Sors –

+1

qitapi, принимающий ответ, будет приятным :) Я имел в виду, что часто у вас есть «черные» значения RGB, такие как (2,1,3) вместо (0,0,0), поэтому вы должны проверить, чем ваш порог вместо проверки на 0 – Sors

Смежные вопросы