接上篇文章:获取像素颜色之后,判断改颜色为哪种颜色大类, 方便进行图片总体色系、色调主题的分析。
package com.polar.core.bdata.util;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
import java.util.*;
public class ColorExtractionTool {
public static void main(String[] args) {
Scalar scalarColor = new Scalar( 255, 255, 0 );
double[] color = rgbToHSL(scalarColor);
String colorSeries = getColorSeries(color);
System.out.println("---------所属颜色大类-----------" + colorSeries);
}
public static double[] rgbToHSL(Scalar rgbColor) {
double[] hslColor = new double[3];
double r = rgbColor.val[0] / 255.0;
double g = rgbColor.val[1] / 255.0;
double b = rgbColor.val[2] / 255.0;
double max = Math.max(r, Math.max(g, b));
double min = Math.min(r, Math.min(g, b));
double h, s, l;
if (max == min) {
h = 0;
} else if (max == r) {
h = (60 * ((g - b) / (max - min)) + 360) % 360;
} else if (max == g) {
h = (60 * ((b - r) / (max - min)) + 120) % 360;
} else {
h = (60 * ((r - g) / (max - min)) + 240) % 360;
}
l = (max + min) / 2;
if (max == min) {
s = 0;
} else if (l <= 0.5) {
s = (max - min) / (2 * l);
} else {
s = (max - min) / (2 - 2 * l);
}
hslColor[0] = h;
hslColor[1] = s * 100;
hslColor[2] = l * 100;
return hslColor;
}
public static String getColorSeries(double[] hslColor) {
double h = hslColor[0];
double s = hslColor[1];
double l = hslColor[2];
if (l < 15) {
return "黑色";
} else if (l > 85 && s < 15) {
return "白色";
} else if ((l > 15 && l < 65) && s < 15) {
return "灰色";
} else if (h >= 330 || h < 30) {
return "红色";
} else if (h >= 30 && h < 90) {
return "黄色";
} else if (h >= 90 && h < 165) {
return "绿色";
} else if (h >= 165 && h < 270) {
return "蓝色";
} else if (h >= 270 && h < 320) {
return "紫色";
} else if (h >= 320 && h < 330) {
return "粉色";
} else {
return "-未知颜色-";
}
}
}
输出结果如下:
---------所属颜色大类-----------黄色
最后可根据结果进行图片色系、颜色主题的分析处理。