参考:https://blog.csdn.net/jkjj2015/article/details/87160291
1.maven项目中需导包
<dependency>
<groupId>org.opencv</groupId>
<artifactId>opencv</artifactId>
<version>3.4.1</version>
</dependency>
2.核心处理代码工具类
package com.cxbdapp.cadre.util;
import org.opencv.core.*;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
public class ImageUtil {
/**
* 文字锐化,将图片流经过文字锐化后,返回BufferedImage类型的图片矫正流
*
* width、heigth参数,两个参数相同,默认值1,调节范围1-9(需为奇数);值越大字体越黑,但也越容易断断续续
* C参数,默认值30,调节范围1-50;值越大背景颜色越浅
* @param bf
* @param width
* @param height
* @param C
* @return
*/
public static BufferedImage bufferedImagePlusBlack(BufferedImage bf, double width, double height, double C) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// 读取图像,不改变图像的原始信息
Mat m = ImgAndMat.img2Mat1(bf);
// 将图片转换成灰度图片
Imgproc.cvtColor(m, m, Imgproc.COLOR_BGR2GRAY);
m.convertTo(m, CvType.CV_32FC1, 1.0 / 255);
Mat dst3 = ReduceBackGroundAlgorithm(m,0);
// Size(width, heigth),width、heigth参数可调,两个参数相同,默认值1,调节范围1-9(需为奇数);
Imgproc.GaussianBlur(dst3, dst3, new Size(width, height), 0, 0, 4);
// 去除背景色后再进一步二值化,C参数可调,默认值30,调节范围1-50;
Imgproc.adaptiveThreshold(dst3,dst3,255,0,0,31,C);
// Mat转换图片流
BufferedImage bfRotate = Mat2BufImg(dst3, ".jpg");
return bfRotate;
}
/**
* 文字锐化处理程序
* @param src
* @param flag
* @return
*/
public static Mat ReduceBackGroundAlgorithm(Mat src,int flag) {
Mat gauss = new Mat();
Mat dst2 = new Mat();
Mat dst3 = new Mat();
if (flag==1) {
Imgproc.GaussianBlur(src, gauss, new Size(31, 31), 0, 0, 4);
} else {
Imgproc.blur(src, gauss, new Size(101,101));
}
Core.divide(src,gauss,dst2);
dst2=ImageSharp(dst2, 101);
dst2.convertTo(dst3, CvType.CV_8UC1,255);
return dst3;
}
/**
* 文字锐化处理程序
* @param src
* @param nAmount
* @return
*/
public static Mat ImageSharp(Mat src, int nAmount) {
Mat dst= new Mat();
double sigma = 3;
float amount = nAmount / 100.0f;
Mat imgBlurred=new Mat();
Imgproc.GaussianBlur(src, imgBlurred, new Size(7,7), sigma, sigma,4);
Mat temp_sub= new Mat();
Core.subtract(src,imgBlurred,temp_sub);
Core.addWeighted(src,1,temp_sub,amount,0,dst);
return dst;
}
/**
* Mat转换成BufferedImage
*
* @param matrix
* 要转换的Mat
* @param fileExtension
* 格式为 ".jpg", ".png", etc
* @return
*/
public static BufferedImage Mat2BufImg(Mat matrix, String fileExtension) {
MatOfByte mob = new MatOfByte();
Imgcodecs.imencode(fileExtension, matrix, mob);
byte[] byteArray = mob.toArray();
BufferedImage bufImage = null;
try {
InputStream in = new ByteArrayInputStream(byteArray);
bufImage = ImageIO.read(in);
} catch (Exception e) {
e.printStackTrace();
}
return bufImage;
}
public static void main(String[] args) throws IOException {
BufferedImage bf = ImageIO.read(new File("F:/1-1-001.jpg"));
BufferedImage bfRotate = bufferedImagePlusBlack(bf, 1, 1, 30);
ImageIO.write(bfRotate,"jpg", new File("F:/up001.jpg"));
}
}