这里将图片所有像素颜色提取归类, 然后将占比颜色最高的颜色提取出来, 即RGB颜色(Scalar),如有需要后期可将RGB转为HSL颜色空间,进行颜色大类的归类,进行颜色分析自动归类。
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.*;
/**
* 描述: 提取图片像素高占比颜色色系工具
* 作者:过路云野
* 创建时间:2023/8/24 10:02
*/
public class ColorExtractionTool {
public static void main(String[] args) {
Mat image = Imgcodecs.imread("这里是你的文件地址...");
if (image.empty()) {
throw new RuntimeException("无法读取图像");
}
// 将图像转换为RGB格式
Mat rgbImage = new Mat();
Imgproc.cvtColor(image, rgbImage, Imgproc.COLOR_BGR2RGB);
// 计算图像中每种颜色的像素数量
Map<Scalar, Integer> colorCounts = getColorCounts(rgbImage);
// 获取占比最多的前3种颜色
List<Scalar> dominantColors = getDominantColors(colorCounts, 3);
for (Scalar color : dominantColors) {
System.out.println("RGB颜色:" + Arrays.toString(color.val));
}
}
/**
* 获取像素颜色个数
* @param image 解析的Mat image
* @return 颜色、像素个数
*/
public static Map<Scalar, Integer> getColorCounts(Mat image) {
Map<Scalar, Integer> colorCounts = new HashMap<>();
// 遍历图像中的每个像素
for (int i = 0; i < image.rows(); i++) {
for (int j = 0; j < image.cols(); j++) {
double[] pixel = image.get(i, j);
Scalar color = new Scalar(pixel);
// 更新颜色计数
if (colorCounts.containsKey(color)) {
colorCounts.put(color, colorCounts.get(color) + 1);
} else {
colorCounts.put(color, 1);
}
}
}
return colorCounts;
}
/**
* 获取占比最前的N个颜色
* @param colorCounts 颜色集合
* @param numColors N 前N种颜色 格局需求改动
* @return
*/
public static List<Scalar> getDominantColors(Map<Scalar, Integer> colorCounts, int numColors) {
// 按照像素数量降序排序颜色
List<Map.Entry<Scalar, Integer>> sortedColors = new ArrayList<>(colorCounts.entrySet());
Collections.sort(sortedColors, (a, b) -> b.getValue().compareTo(a.getValue()));
// 获取前N种颜色
List<Scalar> dominantColors = new ArrayList<>();
for (int i = 0; i < Math.min(numColors, sortedColors.size()); i++) {
dominantColors.add(sortedColors.get(i).getKey());
}
return dominantColors;
}
}
后期将更新RGB转HSL颜色空间,实现自动颜色色系得归类。