Java调用opencv证件照二值化操作

1.为什么要说证件照

  因为证件照的背景颜色是固定的,或者背景颜色大致是一致的有些深浅区别
复制代码

2.上篇文章介绍了聚类函数的用法

image.png

  通过聚类函数分类会对照片的相同或者接近的颜色进行分类,标记为不同的颜色。
  图片背景颜色被分类为统一的颜色。
  那么分类后如何实现二值化(其实就是黑白照片)?
  1.第一种方法是根据聚类函数:
    首先提取背景图片的某个像素点,然后根据聚类函数生成的图片对这个像素点的一个匹配度,如果相同则填充白色,如果不相同就填充黑色
  2.第二种方法是手动确定背景颜色区分的
    Imgproc.cvtColor
    Core.inRange
  
复制代码

3.聚类代码实现例子

// 背景与人物二值化,注意单通道
Mat mask=new Mat(image.size(),CvType.CV_8UC1);
int bindex = (int)bestLabels.get(0,0)[0];//获得kmeans后背景的标签
double array2[]= {0,0,0};//黑色
double array[]= {255,255,255};//白色
Mat dst=image.clone();
for (int i = 0; i < height; i++) {
	for (int j = 0; j < width; j++) {
		index = i*width + j;
		double label = (int)bestLabels.get(index,0)[0];
		if (label-bindex==0) {
			mask.put(i, j,array);
		}else {
			mask.put(i, j,array2);
		}
	}
}
HighGui.imshow("mask", mask);
		
复制代码

效果

image.png

4.另一种方法inRange

Mat zeroImage=new Mat();
Mat close=new Mat();
//转换为hsv的单通道
Imgproc.cvtColor(image, zeroImage, Imgproc.COLOR_RGB2HSV);
HighGui.imshow("cvtColor", zeroImage);
//高、低阈值范围之内,则在zeroImage图像中令该像素值为255 白色,否则令其为0黑色
//Scalar是具有三个参数的结构体,三个参数代表 hsv的色相,饱和度,亮度值
//这里需要自己调节scallar值
Core.inRange(zeroImage, new Scalar( 10, 40, 45), new Scalar( 95, 255, 255), close);
HighGui.imshow("close", close);
复制代码

效果图

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享