java 【OpenCv】过滤 颜色
分享链接
链接 :https://pan.baidu.com/s/1nKY23CCMF--fOBM0eCw8Bg
提取码: 8zik
opencv-4.2.0.zip 内用dll(32、64)链接库,
maven环境需要将jar包加载到本地仓库
OpenCv 初始化 Mat
1、路径初始化方法
String path="文件路径";
Mat imdecode = Imgcodecs.imread(path);
2.字节数据初始方法
byte[] imagebye;//图片字节数组
MatOfByte min_matOfByte = new MatOfByte(imagebye);
Mat imdecode = Imgcodecs.imdecode(min_matOfByte, 1);
过滤颜色
/**
*@description: 过滤颜色
*@param : src
*@author:
*@return: mat2 返回过滤颜色后的对象
*@throws:
*@date: 2020/3/13 16:12
*/
public Mat FilterColor(Mat src) throws Exception {
Size size = src.size();
if (size.width == 0 || size.height == 0) {
return src;
}
//扫描后的图片
Mat hsv_image = new Mat(src.size(), src.type());
Mat mat2 = new Mat(src.size(), src.type());
//将图片的格式转为HSV模式,原来为RGB
Imgproc.cvtColor(src, hsv_image, Imgproc.COLOR_BGR2HSV);
// 色调(H),饱和度(S),明度(V)
// 颜色的提取
int num=0;
int num_rows = hsv_image.rows();
int num_col = hsv_image.cols();
for (int i = 0; i < num_rows; i++) {
for (int j = 0; j < num_col; j++) {
// 获取每个像素
double[] clone = hsv_image.get(i, j).clone();
double hun = clone[0]; // HSV hun
if (((hun >= 0 && hun <= 10) || (hun >= 125 && hun <= 180))&&(clone[1] >= 43 )) {//(clone[2] < 240 && clone[2] > 46)
clone[0] = 0;
clone[1] = 0;
clone[2] = 221;
num++;
mat2.put(i, j, clone);
}else{
mat2.put(i, j, clone);
}
}
}
Imgproc.cvtColor(mat2, mat2, Imgproc.COLOR_HSV2BGR);
return mat2;//过滤红色
}
文字图片倾斜矫正
//通过霍夫变换计算角度
private double CalcDegree(Mat srcImage, Mat dst) {
Mat midImage = new Mat();
Mat dstImage = new Mat();
Imgproc.cvtColor(srcImage, dstImage, Imgproc.COLOR_BGR2GRAY);
Imgproc.Canny(dstImage, midImage, 60, 200);
//通过霍夫变换检测直线
Mat lines = new Mat();
int thresholdcode = 30;
int startthreshold = 1000;//这个值越大,精度越高
while (startthreshold > thresholdcode) {
//通过霍夫变换检测直线
HoughLines(midImage, lines, 1, Math.PI / 180, startthreshold, 0, 0);//thresholdcode是阈值,阈值越大,检测精度越高
if (lines.rows() == 0) {
startthreshold -= 20;
} else {
break;
}
}
//在上面精确度中没找到直线 直接跳出矫正程序
if (lines.rows() == 0) {
return 0.0;
}
double sum = 0;
//依次画出每条线段
for (int x = 0; x < lines.rows(); x++) {
double[] vec = lines.get(x, 0);
double rho = vec[0];
double theta = vec[1];
Point pt1 = new Point();
Point pt2 = new Point();
//cout << theta << endl;
double a = Math.cos(theta), b = Math.sin(theta);
double x0 = a * rho, y0 = b * rho;
pt1.x = Math.round(x0 + 1000 * (-b));
pt1.y = Math.round(y0 + 1000 * (a));
pt2.x = Math.round(x0 - 1000 * (-b));
pt2.y = Math.round(y0 - 1000 * (a));
//只选角度最小的作为旋转角度
sum += theta;
if (theta >= 0) {
Imgproc.line(dstImage, pt1, pt2, new Scalar(55, 100, 195), 1, Imgproc.LINE_AA); //Scalar函数用于调节线段颜色
}
// if (!dstImage.empty()) {
// HighGui.imshow("直线探测效果图", dstImage);
// }
}
double average = sum / lines.rows(); //对所有角度求平均,这样做旋转效果会更好
double angle = DegreeTrans(average) - 90;
rotateImage(dstImage, dst, angle);
//imshow("直线探测效果图2", dstImage);
return angle;
}