1.为什么要说证件照
因为证件照的背景颜色是固定的,或者背景颜色大致是一致的有些深浅区别 复制代码
2.上篇文章介绍了聚类函数的用法
网络异常,图片无法展示
|
通过聚类函数分类会对照片的相同或者接近的颜色进行分类,标记为不同的颜色。 图片背景颜色被分类为统一的颜色。 那么分类后如何实现二值化(其实就是黑白照片)? 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); 复制代码
效果
网络异常,图片无法展示
|
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); 复制代码
效果图
网络异常,图片无法展示
|