Как удалить фоновое изображение с Opencv

я новый opencv. я пишу удалить фон.
мое входное изображение введите описание изображения здесь

я запрограммировал свою программу следующим образом:
— рассчитать среднее количество пикселей

//define roi of image
cv::Rect roi(0, 0, 20 , 20 );

//copies input image in roi
cv::Mat image_roi = imgGray( roi );

//imshow("roi", image_roi);
//computes mean over roi
cv::Scalar avgPixelIntensity = cv::mean( image_roi );
//prints out only .val[0] since image was grayscale
cout << "Pixel intensity over ROI = " << avgPixelIntensity.val[0] << endl;

-создать новую базу изображений Mat на основе средних значений пикселей:

//create new mat image base on avgPixelIntensity
cv::Mat areaSampleArv(imgGray.rows, imgGray.cols,imgGray.type(),avgPixelIntensity.val[0]);
imshow("areaSampleArv", areaSampleArv);

-Инвертировать изображение:

void image_invert(Mat& image){
int height, width, step, channels;
uchar *data;

height = image.cols;
width  = image.rows;
step   = (int)image.step;
channels = image.channels();
data = (uchar *)image.data;

for(int i = 0; i < height; i++){
for(int j = 0; j < width; j++){
for(int k = 0; k < channels; k++){
data[i*step + j*channels + k] = 255 - data[i*step + j*channels + k];
}
}
}

//imwrite("/Users/thuydungle/Desktop/1234/inverted.png", image);
imshow("inverted", image);}

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

-Добавить перевернутое изображение с оригинальным изображением:

 Mat dst;
dst = areaSampleArv + im0;
imshow("dst", dst);

любой мой результат изображения: введите описание изображения здесь

Кажется, это очень плохо, и я могу использовать пороговое значение для извлечения чисел?
Итак, вы можете сказать мне, как это исправить?
спасибо!

4

Решение

Вы могли бы попробовать cv:inRange() для цветового порога.

cv::Mat image = cv::imread(argv[1]);
if (image.empty())
{
std::cout << "!!! Failed imread()" << std::endl;
return -1;
}

cv::Mat threshold_image;

// MIN B:77 G:0 R:30    MAX B:130 G:68 R:50
cv::inRange(image, cv::Scalar(77, 0, 30),
cv::Scalar(130, 68, 50),
threshold_image);

cv::bitwise_not(threshold_image, threshold_image);

cv::imwrite("so_inrange.png", threshold_image);

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

int erode_sz = 4;
cv::Mat element = cv::getStructuringElement(cv::MORPH_ELLIPSE,
cv::Size(2*erode_sz + 1, 2*erode_sz+1),
cv::Point(erode_sz, erode_sz) );

cv::erode(threshold_image, threshold_image, element);
cv::imwrite("so_erode.png", threshold_image);

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

cv::dilate(threshold_image, threshold_image, element);
cv::imwrite("so_dilate.png", threshold_image);

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

cv::imshow("Color Threshold", threshold_image);
cv::waitKey();

Вы также можете выполнить cv::blur(threshold_image, threshold_image, cv::Size(3, 3)); после cv::bitwise_not() чтобы получить немного лучший результат.

Получайте удовольствие, изменяя код вокруг.

8

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

Других решений пока нет …

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