2015-05-24 6 views
3

Я пытаюсь обнаружить скин на изображениях с помощью opencv (новичок в нем), но мне удалось получить НЕКОТОРУЮ часть кожи, которая будет обнаружена, однако, похоже, что это создает некоторый шум на изображении. Вот оригинальное изображение:Устранение неполадок кожи

original

Результат моего кода:

result

код, который prouduces это:

Mat image = Imgcodecs.imread(name); 

Imgproc.pyrMeanShiftFiltering(image, image, 10, 20); 
Imgproc.blur(image, image, new Size(3, 3)); 

Mat hsv = new Mat(); 
Imgproc.cvtColor(image, hsv, Imgproc.COLOR_BGR2HSV); 

Mat bw = new Mat(); 
Core.inRange(hsv, new Scalar(0, 10, 60), new Scalar(20, 150, 255), bw); 

List<MatOfPoint> contours = new ArrayList<>(); 
Mat hierarchy = new Mat(); 
Imgproc.findContours(bw, contours, hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_NONE, new Point(0, 0)); 
int s = findBiggestContour(contours); 

Mat drawing = new Mat(image.size(), CvType.CV_8UC1); 
Imgproc.drawContours(drawing, contours, s, new Scalar(255), -1, 8, hierarchy, 0, new Point(0, 0)); 

Imgcodecs.imwrite(rename(name), drawing); 

Как исправить код обнаружить оставшуюся кожу на изображении и избавиться от шума?

Я использую Java с OpenCV 3.0.0.

ответ

1

Поскольку вы используете findBiggestConour(), я думаю, вы делаете только самый большой матч, не все из них. Так как самый большой контур является тем, который показан на втором изображении, показанном на рисунке.

+0

Именно поэтому это произошло, но также стоит отметить, что мне нужно было правильно настроить значения, соответствующие коже. – tofiffe

0

Просто, чтобы добавить к сказанному выше сказанное JanSLO, я попробовал ваш код и вместо рисования только самого большого контура, я нарисовал все контуры и получил следующий результат.

//c++ code, not java 
Mat drawing = Mat::zeros(img.size(), CV_8UC1); 
for(int i=0; i < contours.size(); ++i) { 
    drawContours(drawing, contours, i, Scalar(255), 3, 8, hierarchy, 0, Point(0, 0)); 
} 
imwrite("data/skin_detect_out.jpg", drawing); 

skin_detect_out.jpg

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

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