Java + OpenCV 读取图片文件的所有像素颜色以及该颜色所有像素数

这里将图片所有像素颜色提取归类, 然后将占比颜色最高的颜色提取出来, 即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颜色空间,实现自动颜色色系得归类。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的Java代码示例,实现了一个颜色识别类: ```java import java.awt.Color; public class ColorRecognizer { public String recognizeColor(Color color) { int red = color.getRed(); int green = color.getGreen(); int blue = color.getBlue(); if (isRed(red, green, blue)) { return "红色"; } else if (isGreen(red, green, blue)) { return "绿色"; } else if (isBlue(red, green, blue)) { return "蓝色"; } else { return "未知颜色"; } } private boolean isRed(int red, int green, int blue) { return red > green && red > blue && red >= 200; } private boolean isGreen(int red, int green, int blue) { return green > red && green > blue && green >= 200; } private boolean isBlue(int red, int green, int blue) { return blue > red && blue > green && blue >= 200; } public static void main(String[] args) { ColorRecognizer recognizer = new ColorRecognizer(); Color redColor = new Color(255, 0, 0); String recognizedRed = recognizer.recognizeColor(redColor); System.out.println("Recognized color: " + recognizedRed); Color greenColor = new Color(0, 255, 0); String recognizedGreen = recognizer.recognizeColor(greenColor); System.out.println("Recognized color: " + recognizedGreen); Color blueColor = new Color(0, 0, 255); String recognizedBlue = recognizer.recognizeColor(blueColor); System.out.println("Recognized color: " + recognizedBlue); Color unknownColor = new Color(128, 128, 128); String recognizedUnknown = recognizer.recognizeColor(unknownColor); System.out.println("Recognized color: " + recognizedUnknown); } } ``` 在上述代码中,`ColorRecognizer`类包含了一个`recognizeColor`方法,该方法接收一个`Color`对象作为参数,根据RGB值判断颜色,并返回对应的颜色名称。 私有方法`isRed`、`isGreen`和`isBlue`用于判断颜色是否为红色、绿色和蓝色。这里简单地通过比较RGB值来判断颜色。 在`main`方法中创建了一个`ColorRecognizer`对象,并使用不同的颜色对象调用`recognizeColor`方法进行颜色识别,并打印识别结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值