【OpenCV】灰度化

Java OpenCV数字图像处理——灰度化

图像处理的第一步操作基本都是进行灰度化,基本分为三大种,分别为加权平均值灰度化、最大值灰度化、平均值灰度化。

一、灰度的概念

在数字图像中,像素是基本的表示单位,各个像素的亮安程度用灰度值来标识,只含亮度信息,不含色彩信息的图像称为灰度图像,对于单色图像,它的每个像素的灰度值用【0,255】区间的整数表示,即图像分为256个灰度等级,对于彩色图像,他的每个像素由R,G,B三个单色调配而成,如果每个像素的R,G,B完全相同,也就是R=G=B=D,该图像就是灰度图像,D为图像的灰度值,此时图像可以为单通道图像,所有像素值为D;

二、代码示例

原图
在这里插入图片描述

1、加权平均值 D=0.299R+0.587G+0.114*B

/**
     * 灰度三种测试,opencv默认是加权平均值法
     *
     * @throws IOException
     */
    public static void main(String[] args) {
        Mat src = Imgcodecs.imread("image/cat.jpg", Imgcodecs.IMREAD_COLOR);
        HighGui.imshow("原图", src);
        //检测图像是否加载成功
        if (src.empty()) {
            System.out.println("not find the image");
            return;
        }

        //自定义空白单通道图像,用于存放灰度图
        Mat dst = new Mat(src.size(), CvType.CV_8UC1);
        dst.setTo(new Scalar(255, 255, 255));
        Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
        HighGui.imshow("灰度",dst);

		//加权平均值法D=0.299R+0.587G+0.114*B
        for (int row = 0; row < src.rows(); row++) {
            for (int col = 0; col < src.cols(); col++) {
                if (src.channels() == 3) {
                    double[] colors = src.get(row, col);
                    double color = colors[0] * 0.114 + colors[1] * 0.587 + colors[2] * 0.299;
                    dst.put(row, col, color);
                }
            }
        }
        HighGui.imshow("加权平均值法", dst.clone());
        HighGui.waitKey(0);
        System.exit(0);
    }

在这里插入图片描述

2、平均值法D=(R+G+B)/3

/**
     * 灰度三种测试,opencv默认是加权平均值法
     *
     * @throws IOException
     */
    public static void main(String[] args) {
        Mat src = Imgcodecs.imread("image/cat.jpg", Imgcodecs.IMREAD_COLOR);
        HighGui.imshow("原图", src);
        //检测图像是否加载成功
        if (src.empty()) {
            System.out.println("not find the image");
            return;
        }

        //自定义空白单通道图像,用于存放灰度图
        Mat dst = new Mat(src.size(), CvType.CV_8UC1);
        dst.setTo(new Scalar(255, 255, 255));
        Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
        HighGui.imshow("灰度",dst);
        
        //平均值法
        for (int row = 0; row < src.rows(); row++) {
            for (int col = 0; col < src.cols(); col++) {
                if (src.channels() == 3) {
                    double[] colors = src.get(row, col);
                    double color = Math.floorDiv((long) (colors[0] + colors[1] + colors[2]), 3);
                    dst.put(row, col, color);
                }
            }
        }
        HighGui.imshow("平均值法", dst.clone());
        HighGui.waitKey(0);
        System.exit(0);
    }

在这里插入图片描述

3、最大值法

/**
     * 灰度三种测试,opencv默认是加权平均值法
     *
     * @throws IOException
     */
    public static void main(String[] args) {
        Mat src = Imgcodecs.imread("image/cat.jpg", Imgcodecs.IMREAD_COLOR);
        HighGui.imshow("原图", src);
        //检测图像是否加载成功
        if (src.empty()) {
            System.out.println("not find the image");
            return;
        }

        //自定义空白单通道图像,用于存放灰度图
        Mat dst = new Mat(src.size(), CvType.CV_8UC1);
        dst.setTo(new Scalar(255, 255, 255));
        Imgproc.cvtColor(src, dst, Imgproc.COLOR_BGR2GRAY);
        HighGui.imshow("灰度",dst);

        //最大值
        for (int row = 0; row < src.rows(); row++) {
            for (int col = 0; col < src.cols(); col++) {
                if (src.channels() == 3) {
                    double[] colors = src.get(row, col);
                    Double color = Arrays.stream(colors).boxed().max(Comparator.comparing(x -> x)).orElse(null);
                    dst.put(row, col, color);
                }
            }
        }
        HighGui.imshow("最大值法", dst.clone());
        HighGui.waitKey(0);
        System.exit(0);
    }

![在这里插入图片描述](https://img-blog.csdnimg.cn/982e764372284b65ad8dfcab40fd9528.png

代码地址:Java-opencv

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐