2009-11-25 6 views
-2

Я ищу некоторый алгоритм для совместных объектов, например, объединить яблоко в дерево в цифровом изображении и некоторую демонстрацию в Matlab. Пожалуйста, покажите мне некоторые материалы. Спасибо за чтение и помощь!Как объединить некоторые объекты в цифровом изображении?

+1

При описании вашей проблемы вы должны быть более конкретными. Перепишите его, и, возможно, у кого-то есть ответ. –

+0

Вы имеете в виду форму tweening/morphing? что-то вроде: http://tecfa.unige.ch/guides/flash/ex/shape-tweening-intro/flash-cs3-shape-tweening-hints.html – Amro

ответ

2

Я не уверен, что если я возьму на себя вопрос, но если вы хотите наложить какое-то изображение, как и слои фотошопа, вы можете использовать некоторые характеристики изображения, чтобы через этот символ определить степень прозрачности.

Например, рассмотрите возможность использования двух изображений RGB. Изображение A будет перекрыто изображением B. Для этого мы будем использовать яркость изображения B для определения степени прозрачности (255 = 100%). Интенсивность = пиксель/255;

NewPixel = (PixelA * (1 - Intensity)) + (PixelB * Intensity);

В интенсивности представляет собой процент, и каждый пиксель умножается на дополнении этого процента, полученная в результате сумма будет никогда переполнения более 255 (макс graylevel)

int WidthA = imageA.Width * channels; 
int WidthB = imageB.Width * channels; 

int width = Min(ImageA.Width, ImageB.Width) * channels; 
int height = Min(ImageA.Height, ImageB.Height); 

byte *ptrA = imageA.Buffer; 
byte *ptrB = imageB.Buffer; 

for (int y = 0; y < height; y++) 
{ 
    for (int x = 0; x < width; x += channels, ptrA += channels, ptrB += channels) 
    { 

    //Take the intensity of the pixel. If RGB (channels = 3), intensity = (R+B+G)/3. If grayscale, the pixel value is intensity itself 
    int avg = 0; 
     for (int j = 0; j < channels; ++j) 
     { 
      avg += ptrB[j]; 
     } 

     //Obtain the intensity as a value between 0..100% 
    double intensity = (double)(avg/channels)/255; 

     for (int j = 0; j < channels; ++j) 
     { 
    //Write in image A the resulting pixel which is obtained by multiplying Image B pixel 
    //by 100% - intensity plus Image A pixel multiplied by the intensity 
      ptrA[j] = (byte) ((ptrB[j] * (1.0 - intensity)) + ((intensity) * ptrA[j])); 
     } 
    } 

    ptrA = imageA.Buffer + (y * WidthA)); 
    ptrB = imageB.Buffer + (y * WidthB)); 
} 

Вы можете также изменить этот алгоритм для того, чтобы перекрытие Изображение A над B, в другом месте. Я предполагаю, что координата изображения B (0, 0) будет перекрывать изображение. Координата (0, 0).

Но еще раз, я не уверен, что это то, что вы ищете.

+0

Спасибо Andres очень много! То, что ты сказал, почти то, что мне нужно. Но мне интересно, что на изображении есть много объектов, например, стул, стол, холодильник ... и я просто хочу наложить яблоко на стол, мне нужно определить границу стол и яблоко? Если да, как я могу это сделать? –

+0

Первое, что вам нужно решить (или проблема): как определить позицию объекта, который я хочу совместить? Это исправлено, легко найти? Здесь у вас есть проблема «сегментации объектов», и это не очень просто. – Andres

+0

Если у вас есть позиция и размеры объекта, который вы хотите использовать при перекрытии, вы можете создать маску. Эта маска представляет собой просто двоичное изображение (черно-белое). Белые пиксели соответствуют пикселям объекта, представляющего интерес для исходного изображения. Черные пиксели будут игнорироваться. Таким образом, вы можете использовать один и тот же алгоритм выше, но для каждого пикселя, посмотрите изображение маски, чтобы определить, следует ли его рисовать поверх фонового изображения или просто игнорировать. – Andres

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