2016-12-08 5 views
0

Я новичок в обработке и разработке изображений. Я использовал opencv, Там мне нужно извлечь круг из заданного изображения. Этот круг, заданный координатами x, y, равен (радиус) в Oder, чтобы я использовал следующий код. Но моя проблема в том, что я должен взять черный прямоугольник. Таким образом, патч изображения имеет нежелательные черные пиксели. Как сохранить только круг?Удалить черный фон с изображения.

мой код

double save_key_points(Mat3b img, double x, double y, double radius, string 

    filename, string foldername) 
    { 

     // print image height and width first and check. 
     Vec3f circ(x, y, radius); 

// Draw the mask: white circle on black background 
Mat1b mask(img.size(), uchar(0)); 

circle(mask, Point(circ[0], circ[1]), circ[2], Scalar(255), CV_FILLED); 


// Compute the bounding box 
Rect bbox(circ[0] - circ[2], circ[1] - circ[2], 2 * circ[2], 2 * circ[2]); 

// Create a black image 
Mat3b res(img.size(), Vec3b(0, 0, 0)); 

// Copy only the image under the white circle to black image 
img.copyTo(res, mask); 

// Crop according to the roi 
res = res(bbox); 

//remove black but doesn't work. 
Mat tmp, alpha; 
threshold(res, alpha, 100, 255, THRESH_BINARY); 
     // Save the image 
     string path = "C:\\Users\\bb\\Desktop\\test_results\\test_case8\\" + foldername + filename + ".png"; 

     imwrite(path, res); 
     Mat keypointimg = imread(path, CV_LOAD_IMAGE_GRAYSCALE); 

     //print the cordinate of one patch. 
     cordinate_print(keypointimg, radius); 

    } 

(Здесь я хочу без черного фона) Out put Patch

+0

Ваш вопрос не совсем ясен. Из того, что понимается из вашего кода, у вас есть центр (x, y) и радиус круга, и вы создаете его как черное изображение. Чтобы удалить черную часть, вы можете изменить изображение на BGRA, а для каждого пикселя, имеющего значение (0,0,0), установите альфа = 0; Но какова точка взламывания изображения? –

+0

Если я правильно понимаю, 'img.copyTo (res, mask);' будет копировать только скрытую область (которая является кружком) к целевому изображению. Разве это не возможность создать целевое черное изображение с aplha в первую очередь? Ie: вместо 'Mat3b res (img.size(), Vec3b (0, 0, 0));' создавая его с чем-то вроде 'Mat4b res (img.size(), Vec4b (0, 0, 0, 0)); – Steeve

+0

@Steeve, если я использую Mat4b res (img.size(), Vec4b (0, 0, 0, 0)); ** Необработанное исключение в 0x00007FFF884F7788 в opencvtest.exe ** происходит Исключение составляет ** Ошибка OpenCV: утверждение не выполнено (CV_MAT_TYPE (mtype) == m.type()) в cv :: _ OutputArray :: create, file C: \ строит \ 2_4_PackSlave-Win64-VC12 - ** – Alan

ответ

1

Если я понимаю, что вы просите правильно, вы можете удалить сажу из образа вы можете использовать маску. Маска может выделять все, что имеет определенный цвет, или в вашем случае оттенок черного. Проверьте ссылку для этой реализации и посмотрите, для чего вы ищете. Он находится в питоне, но может быть легко адаптирован.

Image Filtering

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