2015-05-24 125 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); 

如何解決代碼檢測圖像上的剩餘皮膚並消除噪音?

我在OpenCV 3.0.0中使用Java。

回答

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

我的結果感到驚喜,因爲這是這樣一個簡單的代碼。更高級的基於像素的皮膚檢測方法包括使用訓練數據製作皮膚像素的概率模型,並使用該模型來分類給定像素是否是皮膚。