分享给java的同学
工作需要对图片中的印章进行提取,这就用到了opencv的像素遍历
不用多废话,直接
-
/**
-
* 遍历图片中全部红色部分
-
* @author Administrator
-
*
-
*/
-
public
class Test3 {
-
public static void main(String[] args) {
-
//导入dll
-
String relativelyPath = System.getProperty(
“user.dir”);
-
System.load(relativelyPath +
“\\lib\\opencv_java310.dll”);
-
//扫描图片地址
-
Mat mat = Imgcodecs.imread(
“E:/12.png”);
-
//扫描后的图片
-
Mat hsv_image =
new Mat(mat.size(), mat.type());
-
Mat mat2=
new Mat(mat.size(), mat.type());
-
//将图片的格式转为HSV模式,原来为RGB
-
Imgproc.cvtColor(mat, 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++) {
-
System.out.println(
“i:”+i+
” j:”+j);
-
// 获取每个像素
-
double[] clone = hsv_image.get(i, j).clone();
-
double hun = clone[
0];
// HSV hun
-
-
if ((hun >=
0 && hun <
10) || (hun >
156 && hun <
180)) {
-
if (clone[
1] >
35 && clone[
1] <
255) {
-
if (clone[
2] <
255 && clone[
2] >
46) {
-
// 红色范围,全部设置为黑色,
-
clone[
0] =
0;
-
clone[
1] =
0;
-
clone[
2] =
255;
-
num++;
-
mat2.put(i, j, clone);
-
}
-
}
-
}
-
}
-
}
-
System.out.println(num);
-
String filename =
“E:/gray.png”;
-
//保存图像到Result目录中
-
Imgcodecs.imwrite(filename, mat2);
-
}
原图:
结果如下:
效果相对模糊
实现了对红色印章的像素遍历,如果要判断图片中是否有印章,还需要使用霍夫圆来识别图片中的圆,详细操作可以看我其他帖子霍夫圆识别
如果大家有问题,可以在评论提出