opencv之直方图绘制及均衡化

news2024/11/20 16:34:37

直方图均衡化优势

增强图像对比度,使对比度较低的局部区域获得高对比度。当图像非常暗或者非常亮,并且背景和前景之间的差异非常小时,此方法非常有效,能够解决暴露过度或暴露不足的问题。

直方图均衡化缺陷

背景噪声增强、有用信息减少,同时在增加图像对比度时,直方图会发生变化和扩散。

代码

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;


class QuickDemo
{
public:
    void hist_cal_equalize(Mat &image);
    Mat norm(Mat &image);
};


Mat QuickDemo::norm(Mat &image)
{
    vector<Mat> bgr_planes;
    // 将三通道图像划分成单通道图像
    split(image, bgr_planes);

    int histSize = 256;
    float range[] = { 0, 256 };

    const float *histRanges = { range };
    Mat b_hist, g_hist, r_hist;
    // 统计单通道图像直方图
    calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRanges, true, false);
    calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRanges, true, false);
    calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRanges, true, false);
    
    // 直方图高和宽
    int hist_h = 400;
    int hist_w = 512;
    int bin_w = hist_w / histSize;
    Mat histImage(hist_w, hist_h, CV_8UC3, Scalar(0, 0, 0));
    normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1, Mat());  // 归一化到(0, hist_h)
    normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX, -1, Mat());
    normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX, -1, Mat());
    
    // 绘制直方图
    for (int i = 1; i < histSize; i++)
    {
        line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(b_hist.at<float>(i - 1))),
            Point((i)*bin_w, hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 1, LINE_AA);

        line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(g_hist.at<float>(i - 1))),
            Point((i)*bin_w, hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 1, LINE_AA);

        line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(r_hist.at<float>(i - 1))),
            Point((i)*bin_w, hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 1, LINE_AA);
    }

    return histImage;
}


void QuickDemo::hist_cal_equalize(Mat &image)
{
    imshow("input", image);

    Mat hist_src, hist_dst;

    hist_src = norm(image);
    imshow("hist_src", hist_src);

    Mat img;
    image.copyTo(img);

    cvtColor(img, img, COLOR_BGR2YCrCb);

    vector<Mat> channel;
    split(img, channel);

    // 直方图均衡化,该函数只能处理单通道图像
    equalizeHist(channel[0], channel[0]);

    merge(channel, img);

    cvtColor(img, img, COLOR_YCrCb2BGR);

    imshow("output", img);

    hist_dst = norm(img);
    imshow("hist_dst", hist_dst);

}


int main()
{
    Mat image = imread("D:\\c++_opencv\\images\\0--Parade_0_Parade_marchingband_1_20.jpg", IMREAD_ANYCOLOR);

    QuickDemo qd;

    qd.hist_cal_equalize(image);

    waitKey(0);
    destroyAllWindows();

    return 0;
}

结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多彩的书写工具,画图写字更好看,米家液晶小黑板多彩版上手

平时临时记些信息&#xff0c;或者是教小朋友认字的时候&#xff0c;液晶小黑板都是特别实用的工具&#xff0c;我之前就用过米家液晶小黑板&#xff0c;最近我发现米家新出了一款彩色笔迹的小黑板&#xff0c;书写效果更加好看&#xff0c;比以前单色款的更好用。 这款米家液晶…

【技术分享】MA21日均线交易策略

文章目录1.前言1.1.相关术语1.2.MA均线系统设置分类1.3.斐波那契数列2.MA21日均线2.1.MA21日均线2.2.MA21日均线交易策略2.3.MA21日均线案例分析1.前言 1.1.相关术语 空头市场&#xff08;Bear Market&#xff09;&#xff1a;亦称熊市&#xff0c;指价格长期呈 下跌 趋势的证…

操作系统权限提升(十)之系统错误配置-计划任务提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 操作系统权限提升(五)之系统错误配置-PATH环境变量提权 操作…

VUE3.0学习

一、父子传值 父组件向子组件传值和vue2.0相比区别不大&#xff0c;区别在于api的使用&#xff0c;让接收参数的写法多样化。父组件::::: <template><div class"about"><div><main><TheWelcome :info"parMsg"/></main>…

【react】理解Fiber

FiberFiber概念结构Fiber 树的遍历是这样发生的【深度遍历】。window.requestIdleCallback()requestAnimationFrameFiber 是如何工作的结论有react fiber&#xff0c;为什么不需要vue fiberFiber 概念 JavaScript引擎和页面渲染引擎两个线程是互斥的&#xff0c;当其中一个线…

12月 被大厂以“人员优化”的名义 无情的辞退了...

前几天&#xff0c;一个认识了好几年在大厂工作的测试员朋友&#xff0c;年近30了&#xff0c;却被大厂以“人员优化”的名义无情被辞&#xff0c;据他说&#xff0c;有一个月散伙饭都吃了好几顿…… 在很多企业&#xff0c;都有KPI考核&#xff0c;然后在此基础上还会弄个“…

IB EE 学习干货,从选学科/课题/写稿/对稿/交稿几个方面入手分享

本文从选学科&#xff0c;选课题&#xff0c;写稿&#xff0c;对稿&#xff0c;交稿几个方面入手分享。关于不同学科的EE&#xff0c;本文涵盖了数学和物理EE&#xff08;因为我们猜很多同学们都选了这两个学科的EE&#xff09;。 文中分享的学习方法都是我们从个人经历出发&am…

微服务 @SentinelResource 服务网关

微服务 SentinelResource 服务网关SentinelResourceFeign整合Sentinel什么场景下需要Feign集合Sentinel呢&#xff1f;服务网关为什么需要网关网关组件Gateway快速入门什么是Gateway操作示例自定义路由规则SentinelResource 自定义异常返回是对所有的情况进行统一处理&#xf…

DTC补货实战:从算法到落地

本文作者&#xff1a;凡飞&#xff0c;从快递到快消&#xff0c;一个平凡的供应链算法深耕者。“ 我希望衡量我们ai团队价值的&#xff0c;不是创造了多么精深的算法&#xff0c;而是跨越算法到落地间距离的能力。”近年来随着电商行业从增量市场逐步成长到了存量市场&#xff…

第二章.神经网络—激活函数

第二章.神经网络 感知机存在如何设置合适的权重问题&#xff0c;神经网络的出现就是为了解决感知机存在的问题&#xff0c;神经网络的一个重要性质&#xff1a;它可以自动的从数据中学习到合适的权重参数。 2.1.从感知机到神经网络 1.神经网络示例 1).示意图&#xff1a; 网络…

《技术领导力:程序员如何才能带团队》 读书笔记

技术管理工作 管理者能力 作为技术团队管理者&#xff0c;无论具体管几个人&#xff0c;最好能够拥有以下能力&#xff0c;才能满足各个需求方提出的需求&#xff1a; 深入理解一门或多门编程语言深入理解多种流行的框架系统架构能力强&#xff0c;拥有复杂系统的设计经验积…

Hystrix高可用框架

Hystrix是什么 Hystrix Home,Hystrix是高可用性保障的一个框架。Netflix的API团队从2011年开始做一些提升系统可用性和稳定性的工作,Hystrix就是从那时候开始发展的。在2012年的时候,Hystrix就变得比较成熟和稳定了,Netflix中除了API团队以外,很多其他的团队都开始使用Hy…

vue2.6.10+vite2开启template模板动态编译

在从vue-cli迁移到vite2的时候&#xff0c;之前在代码中使用的模板编译遇到了问题&#xff1a;我在项目中会根据后台返回的内容动态渲染&#xff0c;如果返回内容中有<el-image>等标签&#xff0c;v-html无法识别非html标签&#xff0c;导致图片渲染失败&#xff0c;因此…

基于Springboot搭建java项目(三十二)—— Docker部署java服务

Docker部署java服务 一、Linux服务安装Docker 关于Docker的安装在之前的Linux的三种安装方式的第三种安装方式中有介绍 传送门&#xff1a;https://blog.csdn.net/m0_46616045/article/details/128841396 二、编写DockerFile 1、将需要部署的Jar包放到服务器上 2、编写Doc…

3.【SpringBoot源码】SpringBoot自动配置原理

目录 一、简介 1)、SpringBootConfiguration 2)、ComponentScan 3)、EnableAutoConfiguration 二、AutoConfigurationPackage 三、Import(AutoConfigurationImportSelector.class) 1)、AutoConfigurationImportSelector介绍 2)、自动配置流程 2-1)、ConfigurationClas…

Vue中数组的列表渲染(v-for渲染数组,数组改变,页面不渲染问题)

1.基本的列表&#xff08;v-for的基本使用&#xff09;&#xff1a; <template><!-- v-for指令:1.用于展示列表数据2.语法&#xff1a;v-for"(item, index) in xxx" :key"yyy"3.可遍历&#xff1a;数组、对象、字符串&#xff08;用的很少&#…

计算机网络基础学习指南(二)

4. HTTP协议 简介 5. Socket 5.1 简介 即套接字&#xff0c;是应用层 与 TCP/IP 协议族通信的中间软件抽象层&#xff0c;表现为一个封装了 TCP / IP协议族 的编程接口&#xff08;API&#xff09; Socket不是一种协议&#xff0c;而是一个编程调用接口&#xff08;API&#…

HashMap源码详细解析

HashMap的继承:HashMap实现了Cloneable接口&#xff0c;所以可以被克隆HashMap实现了Serializable接口&#xff0c;可以被序列化HashMap继承了AbstractMap并实现了Map接口&#xff0c;具有Map接口的所有功能存储结构:JDK1.7(包括1.7)之前HashMap底层是数组链表结合而成的高级数…

【深度学习】ReID相关知识点解析(PCB、BoT、MGN)

PCB(Part-based Convolutional Baseline) RPP结构图: 网络流程: 经过一个backbone得到特征图T。T中的每列向量称为f(1,1,c)。 如:输入(384,128,3)经过backbone降采样16倍后得到特征图T(24,8,c)。 将T从上到下切成p(p=6)片。记为P_i(i=1…p)。——测试时接第…

PMP应该如何备考?掌握着三个步骤

在我这里大概就是有三个点需要注意的&#xff1a; 重点一&#xff0c;好好上课 我选择的是线下培训班&#xff0c;一共是6节线下课&#xff0c;每次线下课都占用了周末一整天的时间。 从早上9点到下午5点&#xff0c;没上课前我觉得应该会蛮累的&#xff0c;但实际上下来其实…