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

Har*_*ita 5 android opencv image-processing

不确定这是否是正确的询问方式,但请帮忙.我有一张凹陷车的图像.我必须处理它并突出凹痕并返回凹痕的数量.我能够很好地完成以下结果:

在此输入图像描述

在此输入图像描述

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);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试使用opencv执行此操作时,我得到了这个:

在此输入图像描述

使用以下代码:

   Imgproc.cvtColor(source, middle, Imgproc.COLOR_RGB2GRAY);
    Imgproc.equalizeHist(middle, middle);
    Imgproc.threshold(middle, middle, 150, 255, Imgproc.THRESH_OTSU);
Run Code Online (Sandbox Code Playgroud)

请告诉我如何在opencv中获得更好的结果,以及如何计算凹痕?我试过findcontour(),但它给出了一个非常大的数字.我也尝试过其他图像,但是我没有得到正确的结果.请帮忙.

Ric*_* M. 0

所以你基本上从MATLAB站点imtophat做 - Top-hat 过滤计算图像的形态开口(使用 imopen),然后从原始图像中减去结果。

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

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

kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (15, 15))
Run Code Online (Sandbox Code Playgroud)

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

tophat = cv2.morphologyEx(v, cv2.MORPH_TOPHAT, kernel)
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果 -

高顶礼帽

第 3 步 - 现在您可以手动设置阈值或使用 Otsu -

ret, thresh = cv2.threshold(tophat, 17, 255, 0)
Run Code Online (Sandbox Code Playgroud)

这会给你下面的图片 -

顶部阈值

由于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;
}
Run Code Online (Sandbox Code Playgroud)

确保在灰度图像 (CvType.8UC1​​ ) 上执行此操作,然后可以适当地设置阈值。