Сегментация изображения на основе двоичного изображения

У меня есть эти два изображения, изображение 1 является двоичным изображение 2.

Я хотел бы выделить объект из изображение 2 в форме изображение 1.

           image 1                            image 2

введите описание изображения здесь
введите описание изображения здесь

Я просмотрел несколько примеров, но ни один из них не помог. Мысль о наложении изображения 2 на белую область изображения 1, используя функцию copyTo с условиями, но я уверен, что есть лучший способ. Буду очень признателен, если кто-нибудь подскажет мне метод или фрагмент кода C ++ для решения этой проблемы!

-2

Решение

Да ты прав.

Как указано, вы можете выполнить изображение маскировка Вместо того, чтобы использовать копирование в C ++:

cv::bitwise_and(image1, image2, output);

где image1 это маска и image2 это оригинальное изображение.

Другой метод, который работает для меня, это:

image2.copyTo(image1, image1);

где image1 это маска и image2 это оригинальное изображение. Результат показан ниже:

введите описание изображения здесь

3

Другие решения

Вам нужно отсечь порог, чтобы отделить передний план от фона

/**@file
Get the Otusu threshold for image segmentation.
@param[in] gray - the grayscale image
@param width - image width
@param height - image height
@returns Threshold at which to split pixels into foreground and
background.
@image html maggie.jpg  Margaret Thatcher (1925-2013) greyscale photograph
@image html maggieotsu.gif Mrs Thatcher Otsu thresholded
*/
int getOtsuthreshold(unsigned char *grey, int width, int height)
{
int hist[256] = {0};
int wB = 0;
int wF;
float mB, mF;
float sum = 0;
float sumB = 0;
float varBetween;
float varMax = 0.0f;
int answer = 0;
int i;
int k;

for(i=0;i<width*height;i++)
hist[grey[i]]++;

/* sum of all (for means) */
for (k=0 ; k<256 ; k++)
sum += k * hist[k];

for(k=0;k<256;k++)
{
wB += hist[k];
if (wB == 0)
continue;

wF = width*height - wB;
if (wF == 0)
break;

sumB += (float) (k * hist[k]);

mB = sumB / wB;            /* Mean Background */
mF = (sum - sumB) / wF;    /* Mean Foreground */

/* Calculate Between Class Variance */
varBetween = (float)wB * (float)wF * (mB - mF) * (mB - mF);

/* Check if new maximum found */
if (varBetween > varMax)
{
varMax = varBetween;
answer = k;
}

}
return answer;
}

https://github.com/MalcolmMcLean/binaryimagelibrary

-2

По вопросам рекламы [email protected]