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 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示