使用 OpenCV 中的 Blob 检测进行皮肤毛孔分析
Skin pores analysis using Blob detection in OpenCV
我正在做一个项目,我想检测给定皮肤图像中的毛孔。
我已经使用 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 个斑点。
附上上述代码的输出和源图像。源图像
使用 SIFT 输出图像
是否有任何其他算法可以帮助实现该结果或实现该结果的适当方法是什么?
因为你的问题什么都没问,所以我不会给你答案。更多一般性建议。
您尝试使用指定算法解决该问题清楚地表明您完全不知道自己在做什么。您缺乏图像处理的基础知识。
这就像在你连棋子如何移动都不知道的情况下试图与体面的国际象棋棋手打赢一样。
我强烈建议您为自己准备一本初学者书籍,阅读并确保您理解其中的内容。然后在你使用它们之前,对你想要使用的算法做更多的研究。
您不能随意拍摄一些图像,将其输入您在互联网上找到的一些随机特征检测算法并期望成功。
例如,圆的霍夫变换非常适合寻找大致已知半径的圆形轮廓。如果您知道它的内部工作原理,您就会知道为什么在图像上使用它不是一个好主意。
https://en.wikipedia.org/wiki/Circle_Hough_Transform
Blobdetection 和基于轮廓的算法可能有效,但只有在大量预处理之后。你的形象不太好"segmentation-friendly"
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 尝试了各种方法(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 个斑点。
附上上述代码的输出和源图像。源图像
使用 SIFT 输出图像
是否有任何其他算法可以帮助实现该结果或实现该结果的适当方法是什么?
因为你的问题什么都没问,所以我不会给你答案。更多一般性建议。
您尝试使用指定算法解决该问题清楚地表明您完全不知道自己在做什么。您缺乏图像处理的基础知识。 这就像在你连棋子如何移动都不知道的情况下试图与体面的国际象棋棋手打赢一样。
我强烈建议您为自己准备一本初学者书籍,阅读并确保您理解其中的内容。然后在你使用它们之前,对你想要使用的算法做更多的研究。 您不能随意拍摄一些图像,将其输入您在互联网上找到的一些随机特征检测算法并期望成功。
例如,圆的霍夫变换非常适合寻找大致已知半径的圆形轮廓。如果您知道它的内部工作原理,您就会知道为什么在图像上使用它不是一个好主意。
https://en.wikipedia.org/wiki/Circle_Hough_Transform
Blobdetection 和基于轮廓的算法可能有效,但只有在大量预处理之后。你的形象不太好"segmentation-friendly"
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% 的照明。我不认为检测皮肤毛孔是劣质手机照片的经典任务,所以为什么不在成像设置上花点功夫呢?
图像处理的第一条规则:废话输入=废话输出。你至少应该改变照明的角度,或者更好的方法,比如阴影形状。
为您要做的检测优化的图像至关重要。它将使图像处理变得更加容易。
然后是预处理:如何将已有的图像转换成可以轻松提取特征的图像?
等等...