2017-01-10 162 views
0

中的黑點我也用java OpenCV的識別黑點是在圖像自適應閾值。但是我沒有做到這一點。我的代碼如下。 Have to detect the black dot in the image 當我跟着我在這裏寫的代碼時,代碼無法檢測到黑點。 The output image which is generated from this can be shown as follows. However this is not the image that I need如何識別圖像

/* 
* To change this license header, choose License Headers in Project Properties. 
* To change this template file, choose Tools | Templates 
* and open the template in the editor. 
*/ 

/** 
* 
* @author Samarasinghe 
*/ 
import java.awt.image.BufferedImage; 
import java.awt.image.DataBufferByte; 
import java.io.File; 
import java.util.ArrayList; 
import java.util.List; 
import javax.imageio.ImageIO; 
import org.opencv.core.Core; 
import org.opencv.core.CvType; 
import org.opencv.core.Mat; 
import org.opencv.core.MatOfPoint; 
import org.opencv.core.Point; 
import org.opencv.core.Rect; 
import org.opencv.core.Scalar; 
import org.opencv.imgcodecs.Imgcodecs; 
import org.opencv.imgproc.Imgproc; 

public class kkknewversionj extends javax.swing.JFrame { 

    /** 
    * Creates new form kkknewversionj 
    */ 
    double sum =0; 
    public kkknewversionj() { 
     initComponents(); 
    } 
    public double imageprocessing1(){ 
     try{ 
      System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
      //BufferedImage image= ImageIO.read(new File("C:\\Users\\My Kindom\\Desktop\\printscreen.JPG")); 
      BufferedImage image= ImageIO.read(new File("C:\\Users\\Samarasinghe\\Downloads\\IS_11.jpg"));  
      byte[] data =((DataBufferByte) image.getRaster().getDataBuffer()).getData(); 
        Mat mat = new Mat(image.getHeight(),image.getWidth(), CvType.CV_8UC3); 
        mat.put(0, 0, data); 

        Mat mat1 = new Mat(image.getHeight(), image.getWidth(), CvType.CV_8UC3); 
        Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2GRAY); 

        byte[] data1 = new byte[mat1.rows()*mat1.cols()*(int)(mat1.elemSize())]; 
        mat1.get(0, 0, data1); 
        BufferedImage image1 = new BufferedImage(mat1.cols(), mat1.rows(),BufferedImage.TYPE_BYTE_GRAY); 
        image1.getRaster().setDataElements(0, 0, mat1.cols(), mat1.rows(), data1); 

        ImageIO.write(image1, "jpg", new File("C:\\Users\\Samarasinghe\\Desktop\\gray.jpg")); 
        Mat source = Imgcodecs.imread("C:\\Users\\Samarasinghe\\Desktop\\gray.jpg",Imgcodecs.CV_LOAD_IMAGE_GRAYSCALE); 
        Mat destination = new Mat(source.rows(),source.cols(),source.type()); 
        destination = source; 

        Imgproc.adaptiveThreshold(source,destination,255,Imgproc.ADAPTIVE_THRESH_MEAN_C,Imgproc.THRESH_BINARY, 19,-9); 
        Imgcodecs.imwrite("C:\\Users\\Samarasinghe\\Desktop\\ThreshZero.jpg", destination); 
        List<MatOfPoint> contours= new ArrayList<>(); 
        Mat hierarchy =new Mat(); 

        Imgproc.findContours(destination, contours, hierarchy,Imgproc.RETR_EXTERNAL,Imgproc.CHAIN_APPROX_NONE); 
        //Mat mask= new Mat (image.getHeight(),image.getWidth(),CvType.CV_8UC3); 
        Imgcodecs.imwrite("C:\\Users\\Samarasinghe\\Desktop\\mask.jpg",destination); 
        //Imgproc.drawContours(mask, contours,NORMAL, white); 
        //Imgcodecs.imwrite("C:\\Users\\Samarasinghe\\Desktop\\mask.jpg",mask); 

        for(int j=0;j<contours.size();j++){ 

          sum=sum+contours.size(); 
//       double[] d= hierarchy.get(0, j); 
//       Rect rect = Imgproc.boundingRect(contours.get(j)); 
//       Point pt1=new Point(rect.x,rect.y); 
//       Point pt2=new Point(rect.x+rect.width,rect.y+rect.height); 
//       Scalar eder=new Scalar(0,255,0); 
//       Imgproc.rectangle(destination, pt1, pt2, eder,2); 
//       Mat contour = contours.get(j); 
//       double contourarea=Imgproc.contourArea(contour); 
//       sum = sum + contourarea; 

        }System.out.println("Sum"+sum); 



     }catch(Exception e){ 

     } 
     return sum ; 

    }; 


    /** 
    * This method is called from within the constructor to initialize the form. 
    * WARNING: Do NOT modify this code. The content of this method is always 
    * regenerated by the Form Editor. 
    */ 
    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code">       
    private void initComponents() { 

     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jButton1.setText("jButton1"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() 
       .addContainerGap(302, Short.MAX_VALUE) 
       .addComponent(jButton1) 
       .addGap(25, 25, 25)) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(89, 89, 89) 
       .addComponent(jButton1) 
       .addContainerGap(188, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold>       

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
     imageprocessing1(); 
    }           

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(kkknewversionj.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(kkknewversionj.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(kkknewversionj.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(kkknewversionj.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new kkknewversionj().setVisible(true); 
      } 
     }); 
    } 

    // Variables declaration - do not modify      
    private javax.swing.JButton jButton1; 
    // End of variables declaration     
} 
+2

而不是試圖自適應閾值,您可以嘗試色彩分割。 http://www.pyimagesearch.com/2014/08/04/opencv-python-color-detection/ – ZdaR

+0

你是什麼意思的「未能發現」?它是否僅檢測到黑點的一部分?它是否找到了這個位置,但有洞?它是否也檢測到藍線?它只檢測藍線嗎? – Soltius

+0

@Soltius它沒有檢測到它們中的任何一個.. –

回答

2

Zdar是正確的意見,你應該切換顏色表示。 在這裏,你正在一個灰燼平面上進行閾值處理,在你的情況下,因爲很難區分藍線和黑點,所以你的情況並不好。

如果代表另一種顏色系統圖像,例如其中一個區分「飽和」的彩色和黑白之間更好像HSV,您可以細分你的黑點更容易。

這裏是我得到了你的形象 the Value channel of an HSV representation of your image的HSV代表的價值渠道的結果。

如果你不知道的色彩空間,你可以看看它的相當完整維基百科的文章,例如:https://en.wikipedia.org/wiki/HSL_and_HSV(這也解釋了爲什麼我小心的術語「飽和」)

編輯由克尚:他的HSV表示This is my HSV image when I conduct the colour segmentation

+0

是否使用上限和下限對圖像進行閾值限制? –

+0

我可以知道代碼嗎? –

+0

在我的貼子中的圖像**不是** thresholded,它只是在另一個系統中的表示。一個簡單的單邊界閾值應該足以在之後找到點。 很遺憾,我沒有它Python代碼,只需點擊ImageJ中的幾個按鈕,但我敢肯定有一種方法將RGB轉換爲HSV或其他的OpenCV;) – Soltius