OpenCV 如何進行圖檔修複
修複函數:
.inpaint(imageSrc, imageMask, imageDst, radius, Photo.INPAINT_TELEA);
imageSrc 是修複之前的圖檔
imageMask 是修複模闆
imageDst 修複結果
radius 是修複半徑
Photo.INPAINT_TELEA 是修複方法
準備原圖檔
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiATN381dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yN5cjNxkzY2EjYzMjMhZzYyYzX5UjNwcTM3AzLcdDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
我們可以看到的是在圖檔的右下角 “百家号/阿虹說娛樂”
我們如何把這個去除,這是我們的目的
準備修複模闆
如何建立修複模闆其實是使用這個函數的一個比較重點的事情
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));
我們最終擷取到的修複模闆如下:
使用修複模闆修複圖檔
.inpaint(imageSource, imageMask1, dts, 5, Photo.INPAINT_TELEA);
修複結果:
我們發現在有下家的"百家号/。。。" 已經不見了
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();
}