juechen333 2022-10-05 00:35 采纳率: 75%
浏览 27
已结题

在IDEA中利用OpenCV已经实现了图像直方图,怎样画累计直方图?

在IDEA中利用OpenCV已经实现了图像直方图,怎样画累计直方图?
代码如下
import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

import java.util.ArrayList;
import java.util.List;

public class calHistogram {
    static {
        System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
    }

    public static void main(String[] args) {
        test();
    }

    public static void test() {
        Mat m = Imgcodecs.imread("D:\\Project\\IDEA_Project\\RS01\\src\\rs01\\3.jpg");
        HighGui.imshow("原图", m);
        //灰度
        Mat m1 = new Mat();
        Imgproc.cvtColor(m, m1, Imgproc.COLOR_BGR2GRAY);
        HighGui.imshow("灰度", m1);
        List<Mat> images = new ArrayList<>();
        images.add(m1);

        //计算直方图
        Mat hist = new Mat();
        Imgproc.calcHist(images, new MatOfInt(0), new Mat(), hist, new MatOfInt(256), new MatOfFloat(0, 255));

        //数值归一化
        Core.normalize(hist, hist, 0, 255, Core.NORM_MINMAX);
        int h = hist.rows();
        Mat m2 = new Mat(new Size(400, 400), m.type(), new Scalar(200, 200, 200));

        float[] histData = new float[256];
        hist.get(0, 0, histData);

        int x = 20;
        int y = 300;
        Imgproc.line(m2, new Point(x, 0), new Point(x, y), new Scalar(255, 0, 0));
        Imgproc.line(m2, new Point(x, y), new Point(400, y), new Scalar(255, 0, 0));

        for (int i = 0; i < h - 1; i++) {
            int y1 = (int) histData[i];
            Rect rect = new Rect();
            rect.x = x + i;
            rect.y = y - y1;
            rect.width = 1;
            rect.height = y1;
            Imgproc.rectangle(m2, rect.tl(), rect.br(), new Scalar(15, 15, 15));
        }
        HighGui.imshow("直方图", m2);
        HighGui.waitKey(0);
    }
}

求接下来累计直方图该怎么写,谢谢各位
在网上搜了很久,都没找到利用Java实现的例子
  • 写回答

2条回答 默认 最新

  • 爱晚乏客游 2022-10-08 13:27
    关注

    你的 histData里面存储的就是一张图片的直方图信息啊,举个例子来说histData[20]=200,也就是灰阶为20的高度为200.再来一张图片histData[20]=300,只要将这部分数据累加起来,histDataAll[20]=200+300=500,就是两张图片灰阶为20的高度值。
    所以你可以将每次的histData对应下标累加就是累计直方图了啊。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月20日
  • 已采纳回答 10月12日
  • 创建了问题 10月5日

悬赏问题

  • ¥15 主要进行描述非满管状态下,管路的摩阻系数是怎么变化的,在管路长度方向上是怎么分布的(标签-matlab)
  • ¥15 multisim设计求解如图
  • ¥15 动态多目标优化,求解定义的问题的POF和POS公式
  • ¥30 实验 :UML2.0 行为建模
  • ¥15 设计一种优化调度算法并结合论文中的案例给出调度计划
  • ¥15 py文件打包exe报错TypeError:expected str,bytes or os.PathLike object,not_io.BytesIO
  • ¥15 Java编写学籍信息管理系统
  • ¥15 IPXE网刻客户机找不到服务端
  • ¥15 小贝360-4 配二个 华772S 设置WⅰFi5G 连接
  • ¥15 vs2022的QT报错,好像是缺少winextras