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

标签 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

是否有任何其他算法可以帮助实现该结果或实现该结果的合适方法是什么?

最佳答案

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

您尝试使用指定算法解决该问题清楚地表明您完全不知道自己在做什么。您缺乏图像处理的基础知识。 这就像在您甚至不知道棋子如何移动的情况下试图与优秀的国际象棋棋手打胜仗一样。

我强烈建议您为自己准备一本初学者书籍,阅读并确保您理解其中的内容。然后在你使用它们之前,对你想要使用的算法做更多的研究。 您不能随意拍摄一些图像,将其输入您在 Internet 上找到的某种随机特征检测算法并期望成功。

例如,圆的霍夫变换非常适合寻找大致已知半径的圆形轮廓。如果您知道它的内部工作原理,您就会知道为什么在图像上使用它不是一个好主意。

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

Blob 检测和基于轮廓的算法可能有效,但只有在大量预处理之后。您的图片不是很“适合分割”

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% 的照明。我不认为检测皮肤毛孔是劣质手机照片的经典任务,所以为什么不在成像设置上花点力气呢?

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

为您必须进行的检测而优化的图像至关重要。这将使图像处理变得更加容易。

然后是预处理:如何将现有图像转换成可以轻松提取特征的图像?

等等……

关于java - 使用 OpenCV 中的 Blob 检测进行皮肤毛孔分析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39889165/

相关文章:

javascript - 将图像转换为圆形变体,改变圆的大小和位置

java - OffsetDateTime.parse(String,dateTimeFormatter) 的三个 DateTimeParseException

java - Apache Jackrabbit 中的临时文件不会被删除

python - 如何使用 cv2 计算图像中的不同颗粒?

java - OpenCV Warp 透视图和欧氏距离问题

c++ - C++中的机器学习

python - 查找图像中颜色方 block 的轮廓和中点

python - 当兴趣点位于图像边缘时如何裁剪 3D 图像?

java - 放入 session 中并具有动态 getter 的对象是否应该是线程安全的

java - 如何在JAVA邮件API中从特定字符串位置读取邮件并获取数据