2013-06-25 2 views
2

У меня есть 2 фотографии, содержащие часть друг друга:C# совмещающие два изображения, которые содержат части друг с другом

enter image description here

теперь я хочу, чтобы объединить их вместе, но не повторяя общую часть, в есть что-то вроде этого:

enter image description here

что это лучший способ сделать это?

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

+0

нам нужно больше информации о тех фотографиях, они всегда содержат 3 твердых цвета, как это? если вы расскажете мне больше о них, я могу помочь вам взглянуть на этот вопрос, на который я ответил: http://stackoverflow.com/questions/13548962/crop-remove-unwanted-space-at-the-edges-of- image – Mehran

+0

ok, я только что обновил свой вопрос –

+0

Как они должны распространяться и сливаться? В вашем примере в сплаве больше красного цвета, чем в исходном изображении, это нормально? – Alex

ответ

2

вот решение для Вашего вопроса:

Я определил функцию, которая принимает 2 Bitmaps и возвращает комбинированную Bitmap , в этой функции, я храню первые 2 строки второго растрового изображения в массиве byte поэтому я можно сравнить их с первым растровым изображением на следующем шаге, после чего я начинаю искать согласованные строки в первой растровой карте, когда я оштрафовал совпадающую строку, я сохраняю позицию y , теперь я объединяю эти растровые изображения в соответствии с y I Вы уже нашли!

Вот Demo Project: Download

Вот Решение Файл: Download

вот результаты:

  • Пример 1

enter image description here

  • Пример 2

enter image description here

и вот функция:

private Bitmap CombineImages(Bitmap bmp_1, Bitmap bmp_2) 
{ 
    if (bmp_1.Width == bmp_2.Width) 
    { 
     int bmp_1_Height, bmpWidth, bmp_2_Height; 

     bmpWidth = bmp_1.Width; 
     bmp_1_Height = bmp_1.Height; 
     bmp_2_Height = bmp_2.Height; 

     Color c; 
     bool notFound = false; 
     int firstMatchedRow = 0; 

     byte[,] bmp2_first2rows = new byte[3 * bmpWidth, 2]; 

     for (int b = 0; b < 2; b++) 
     { 
      for (int a = 0; a < bmpWidth; a++) 
      { 
       c = bmp_2.GetPixel(a, b); 
       bmp2_first2rows[a * 3, b] = c.R; 
       bmp2_first2rows[a * 3 + 1, b] = c.G; 
       bmp2_first2rows[a * 3 + 2, b] = c.B; 
      } 
     } 

     for (int y = 0; y < bmp_1_Height - 1; y++) 
     { 
      for (int j = 0; j < 2; j++) 
      { 
       for (int x = 0; x < bmpWidth; x++) 
       { 
        c = bmp_1.GetPixel(x, y + j); 
        if ((bmp2_first2rows[x * 3, j] == c.R) && 
         (bmp2_first2rows[x * 3 + 1, j] == c.G) && 
         (bmp2_first2rows[x * 3 + 2, j] == c.B)) 
        { 
        } 
        else 
        { 
         notFound = true; 
         break; 
        } 
       } 
       if (notFound) 
       { 
        break; 
       } 
      } 
      if (!notFound) 
      { 
       firstMatchedRow = y; 
       break; 
      } 
      else 
      { 
       notFound = false; 
      } 
     } 

     if (firstMatchedRow > 0) 
     { 
      Bitmap bmp = new Bitmap(bmpWidth, firstMatchedRow + bmp_2_Height); 
      Graphics g = Graphics.FromImage(bmp); 
      Rectangle RectDst = new Rectangle(0, 0, bmpWidth, firstMatchedRow); 
      Rectangle RectSrc; 
      g.DrawImage(bmp_1, RectDst, RectDst, GraphicsUnit.Pixel); 
      RectDst = new Rectangle(0, firstMatchedRow, bmpWidth, bmp_2_Height); 
      RectSrc = new Rectangle(0, 0, bmpWidth, bmp_2_Height); 
      g.DrawImage(bmp_2, RectDst, RectSrc, GraphicsUnit.Pixel); 
      return bmp; 
     } 
     else 
     { 
      return null; 
     } 
    } 
    else 
    { 
     return null; 
    } 
} 

И, наконец, я должен отметить, что эти фантастические уроки помогли мне много в обработке изображений:

Image Processing for Dummies with C# and GDI+

Image Processing using C#

Надеется, что это помогает :)

+1

это замечательно! и работает так быстро;) Большое спасибо, теперь, пытаясь понять это –

+0

, вы очень приветствуете – Mehran