使用OpenCV中的Blob检测进行皮肤毛孔分析

时间:2016-10-06 06:39:52

标签: java opencv image-processing feature-detection

我正在开展一个项目,我想检测给定皮肤图像中的毛孔。 我已经尝试使用Java从OpenCv中使用各种方法(HoughCircles,BlobDetection和Contours),但是,我无法继续。

HoughCircles向我展示了所有虚假圆圈,轮廓也是如此。 我目前的代码使用blob检测技术,它也没有显示所需的内容。示例代码如下:

public void detectBlob() {

    Mat orig = Highgui.imread("skin_pore.jpg",Highgui.IMREAD_GRAYSCALE);

    Mat MatOut= new Mat();

    FeatureDetector blobDetector;

    blobDetector = FeatureDetector.create(FeatureDetector.SIFT);

    MatOfKeyPoint keypoints1 = new MatOfKeyPoint();

    blobDetector.detect(orig,keypoints1); 

    org.opencv.core.Scalar cores = new org.opencv.core.Scalar(0,0,255);

    org.opencv.features2d.Features2d.drawKeypoints(orig,keypoints1,MatOut,cores,2);

    Highgui.imwrite("PhotoOut.jpg", MatOut);
}
    public static void main(String args[]) {
        BlobDetection bd = new BlobDetection();
        bd.detectBlob();
    }

当我使用FeatureDetector.SIMPLEBLOB而不是FeatureDetector.SIFT尝试相同的代码时,它显示几乎0个blob。

上面的代码附有输出和源图像。来源图片 enter image description here

使用SIFT输出图像 enter image description here

是否有其他算法可以帮助实现结果,或者可以采用哪种方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

由于你没有在问题中提出任何问题,我不会给你答案。更多一些一般性建议。

您试图使用命名算法解决该问题,这清楚地表明您完全不知道自己在做什么。你缺乏图像处理的基础知识。 如果你甚至不知道这些数字是如何移动的,那就像试图赢得体面的棋手一样。

我强烈建议你给自己一本初学者书,阅读它并确保你理解它的内容。然后对您想要使用的算法进行更多研究,因为您可以使用它们。 您无法拍摄任意图像,将其输入您在互联网上找到的随机特征检测算法并期望成功。

例如,对于圆形的霍夫变换有利于找到大致已知半径的圆形轮廓。如果你知道它在内部如何工作,你就会知道为什么在你的图像上使用它不是一个好主意。

https://en.wikipedia.org/wiki/Circle_Hough_Transform

基于Blobdetection和基于轮廓的算法可能会起作用,但只能经过大量的预处理。您的图片不是非常“细分友好”

https://en.wikipedia.org/wiki/Image_segmentation https://en.wikipedia.org/wiki/Blob_detection

通常必须使用参考图像和参考关键点来教授SIFT检测器。我在你的代码中没有看到这个。

https://en.wikipedia.org/wiki/Scale-invariant_feature_transform

请注意,阅读这些维基百科文章只会让您初步了解正在发生的事情。你必须阅读更多内容。

始终从处理链的开头开始。你能得到更好的图像吗? (更好的意思是更适合你想要检测的东西)。这就像10%相机和90%照明。我不认为检测皮肤毛孔是一个古怪的手机图片,所以为什么不在你的成像设置上投入一点力气?

图像处理的第一条规则:废话=废话。你应该至少改变照明角度,或者更好地接近阴影中的形状。

为您必须做的检测优化的图像是非常的。它将使图像处理变得更加容易。

然后预处理:如何将您拥有的图像转换为可以轻松从中提取特征的图像?

等等......