我正在开展一个项目,我想检测给定皮肤图像中的毛孔。 我已经尝试使用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。
是否有其他算法可以帮助实现结果,或者可以采用哪种方法来实现这一目标?
答案 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%照明。我不认为检测皮肤毛孔是一个古怪的手机图片,所以为什么不在你的成像设置上投入一点力气?
图像处理的第一条规则:废话=废话。你应该至少改变照明角度,或者更好地接近阴影中的形状。
为您必须做的检测优化的图像是非常的。它将使图像处理变得更加容易。
然后预处理:如何将您拥有的图像转换为可以轻松从中提取特征的图像?
等等......