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

时间:2017-07-26 06:48:04

标签: android opencv image-processing

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

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(),但它给出了一个非常大的数字。我也尝试过其他图像,但是我没有得到正确的结果。 请帮忙。

1 个答案:

答案 0 :(得分:0)

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

您可以使用以下步骤在OpenCV中执行此操作:

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

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

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

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

这给出了以下结果 -

TopHat

步骤3 - 现在您可以手动限制它或使用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)上执行此操作,然后您可以适当地设置阈值。