簡體   English   中英

使用opencv在Android中進行閾值處理

[英]Thresholding in Android using opencv

不確定這是否是正確的詢問方式,但請幫忙。 我有一張凹陷車的圖像。 我必須處理它並突出凹痕並返回凹痕的數量。 我能夠很好地完成以下結果:

在此輸入圖像描述

在此輸入圖像描述

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執行此操作時,我得到了這個:

在此輸入圖像描述

使用以下代碼:

   Imgproc.cvtColor(source, middle, Imgproc.COLOR_RGB2GRAY);
    Imgproc.equalizeHist(middle, middle);
    Imgproc.threshold(middle, middle, 150, 255, Imgproc.THRESH_OTSU);

請告訴我如何在opencv中獲得更好的結果,以及如何計算凹痕? 我試過findcontour(),但它給出了一個非常大的數字。 我也嘗試過其他圖像,但是我沒有得到正確的結果。 請幫忙。

所以你基本上來自MATLAB網站imtophat - Top-hat過濾計算圖像的形態開口(使用imopen),然后從原始圖像中減去結果。

您可以使用以下步驟在OpenCV中執行此操作:

第1步:獲取磁盤結構元素

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

步驟2:計算圖像的打開,然后從原始圖像中減去結果

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

這給出了以下結果 -

高頂禮帽

第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 )上執行此操作,然后您可以適當地設置閾值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM