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);
复制代码
效果图
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END