使用OpenCV在Android中进行阈值处理

5

不确定这是否是正确的提问方式,但请帮忙。我有一张凹陷汽车的图片。我必须处理它并突出显示凹痕,并返回凹痕数量。我能够用以下结果做得相当好:

enter image description here

enter image description here

Matlab代码如下:

  img2=rgb2gray(i1);
  imshow(img2);
  img3=imtophat(img2,strel('disk',15));
  img4=imadjust(img3);
  layer=img4(:,:,1);
  img5=layer>100 & layer<250;
  img6=imfill(img5,'holes');
  img7=bwareaopen(img6,5);
  [L,ans]=bwlabeln(img7);
  imshow(img7);
  I=imread(i1);
  Ians=CarDentIdentification(I);

然而,当我尝试使用opencv进行操作时,出现了以下情况:

enter image description here

使用以下代码:
   Imgproc.cvtColor(source, middle, Imgproc.COLOR_RGB2GRAY);
    Imgproc.equalizeHist(middle, middle);
    Imgproc.threshold(middle, middle, 150, 255, Imgproc.THRESH_OTSU);

请告诉我如何在OpenCV中获得更好的结果,以及如何计算凹痕?我尝试使用findcontour()函数,但它返回了非常大的数字。我也在其他图像上尝试过,但没有得到合适的结果。 请帮忙。


你有注意到你在Matlab和OpenCV中使用的阈值值是不同的吗? - Rick M.
当然,我尝试了很多不同的值。Matlab有一个名为imtophat()的函数,其结果是使照明变得均匀,在调整对比度后,凹陷部分非常明亮。因此,这些值在opencv中不起作用。 - Harshita
如果您仔细阅读在Matlab中imtophat的操作,您可以在OpenCV中执行相同的操作,尽管没有直接的滤波器。 - Rick M.
这正是我在这里提问的原因。找不到确切的流程/代码/事情去做。 - Harshita
1个回答

0
所以你基本上来自MATLAB网站imtophat的作用是-顶帽滤波器计算图像的形态学开运算(使用imopen),然后从原始图像中减去结果。

您可以通过以下步骤在OpenCV中执行此操作:

第1步:获取磁盘结构元素

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15))

步骤2:计算图像的开口,然后从原始图像中减去结果

tophat = cv2.morphologyEx(v, cv2.MORPH_TOPHAT, kernel)

这将产生以下结果 -

TopHat

第三步 - 现在你可以手动阈值化它或使用Otsu算法 -

ret, thresh = cv2.threshold(tophat, 17, 255, 0)

这将为您提供以下图像 -

topHat thresholded

由于 OP 想要 Java 代码,这里是可能的 Java 代码:

private Mat topHat(Mat image)
{
Mat element  = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(15, 15), new Point (0, 0));
Mat dst = new Mat;
Imgproc.morphologyEx(image, dst, Imgproc.MORPH_TOPHAT, element, new Point(0, 0));

return dst;
}

请确保在灰度图像上执行此操作(CvType.8UC1),然后您可以适当地进行阈值处理。


谢谢,但这是针对C++的,对吧?我找不到Java中等价于tophat()的函数。此外,在变形过程中,我不能简单地分配整数值。它需要参数-类型(椭圆),大小,锚点。 - Harshita
这些函数在Java、C++和Python的OpenCV中都有。我发布的代码是用Python编写的,因为它对我来说更快看到结果。如果你正在使用android,你可以随时使用NDK C++。示例 - Rick M.
开放是腐蚀+膨胀。我用Java更新了代码,请告诉我是否有效,因为我没有Java的opencv。只是建议,当我还是新手并学习时,我也很高兴为自己获取代码。如果您自己尝试一些东西,这将有助于您长期发展(我已经为您提供了在Python中的方法和一个示例链接,说明如何在Android中完成此操作)。 - Rick M.
我希望你所说的“offensive”是指“critical”。这是基于我的个人经验给出的建议。无论如何,请告诉我它在Java中是否有效。 - Rick M.
形态代码(第5行),它是一个赋值吗?函数不能按原样工作。 - Harshita
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接