天天看點

java Opencv 圖檔修複 Photo

OpenCV 如何進行圖檔修複

修複函數:

.inpaint(imageSrc, imageMask, imageDst, radius, Photo.INPAINT_TELEA);      

imageSrc 是修複之前的圖檔

imageMask 是修複模闆

imageDst 修複結果

radius 是修複半徑

Photo.INPAINT_TELEA 是修複方法

準備原圖檔

java Opencv 圖檔修複 Photo

我們可以看到的是在圖檔的右下角 “百家号/阿虹說娛樂”

我們如何把這個去除,這是我們的目的

準備修複模闆

如何建立修複模闆其實是使用這個函數的一個比較重點的事情

imageMask 是有要求的 要求是單通道,而且是Scalar 的值除了要修複的部分其他的全部為0

并且大小和原圖檔相等

我們先加載原圖檔圖檔:

=Imgcodecs.imread("D:\\360MoveData\\Users\\lxn\\Desktop\\opencv\\xf.jpg");      

我們接下來通過原圖檔來生成模闆

=Imgcodecs.imread("D:\\360MoveData\\Users\\lxn\\Desktop\\opencv\\xf.jpg");
    Mat imageGray=new Mat(); 
    
    
    Mat dts=new Mat(imageSource.size(), CvType.CV_8SC3);
    //轉換為灰階圖
    Imgproc.cvtColor(imageSource, imageGray, Imgproc.COLOR_BGR2GRAY);

//建立模闆
    Mat imageMask =new Mat(imageSource.size(), CvType.CV_8UC1, new Scalar(0,0,0));
    
    //閥值化
    Imgproc.threshold(imageGray, imageMask, 150, 160, Imgproc.THRESH_BINARY);
    
        int width=imageSource.cols();
    int height=imageSource.rows();
        //建立模闆圖層
    Mat imageMask1=new Mat(imageMask.size(), CvType.CV_8UC1, new Scalar(0));
    
    //在模闆圖層上截取要修複的部分
    Mat mat=imageMask.submat(new Rect(new Point(width-200,height-50), new   Point(width,height)));

        //高斯處理均衡化
    Mat blurMat=new Mat();
    Imgproc.GaussianBlur(mat, blurMat, new Size(5, 5), 3);

        //把要修複的部分放到模闆圖層上
    Rect rect=new Rect(new Point(width-200,height-50),mat.size()); 
    blurMat.copyTo(imageMask1.submat(rect));      

我們最終擷取到的修複模闆如下:

java Opencv 圖檔修複 Photo

使用修複模闆修複圖檔

.inpaint(imageSource, imageMask1, dts, 5, Photo.INPAINT_TELEA);      

修複結果:

java Opencv 圖檔修複 Photo

我們發現在有下家的"百家号/。。。" 已經不見了

public void testInpaint2() {
    
    //原圖
    Mat imageSource=Imgcodecs.imread("D:\\360MoveData\\Users\\lxn\\Desktop\\opencv\\xf.jpg");
    Mat imageGray=new Mat();
    
    
    Mat dts=new Mat(imageSource.size(), CvType.CV_8SC3);
    //轉換為灰階圖
    Imgproc.cvtColor(imageSource, imageGray, Imgproc.COLOR_BGR2GRAY);
    Mat imageMask =new Mat(imageSource.size(), CvType.CV_8UC1, new Scalar(0,0,0));
    Imgproc.threshold(imageGray, imageMask, 150, 160, Imgproc.THRESH_BINARY);
    int width=imageSource.cols();
    int height=imageSource.rows();
    Mat imageMask1=new Mat(imageMask.size(), CvType.CV_8UC1, new Scalar(0));
    Mat mat=imageMask.submat(new Rect(new Point(width-200,height-50), new Point(width,height)));

    Mat blurMat=new Mat();
    Imgproc.GaussianBlur(mat, blurMat, new Size(5, 5), 3);

    Rect rect=new Rect(new Point(width-200,height-50),mat.size()); 
    blurMat.copyTo(imageMask1.submat(rect));
    HighGui.imshow("修複前",imageSource);
    HighGui.imshow("修複模闆", imageMask1);
      Photo.inpaint(imageSource, imageMask1, dts, 5, Photo.INPAINT_TELEA);
    HighGui.imshow("修複結果", dts);
    HighGui.waitKey(0);
  }
  public static void main(String[] args) throws Exception {
    ResourceBundle bundle = ResourceBundle.getBundle("opencv");
    String opencvDllName = bundle.getString("opencv.dllpath");
    System.load(opencvDllName);
    new PhotoTest().testInpaint2();
  }