Opencv学习-直方图应用

news2024/11/14 21:35:51

1. 直方图均衡化

        如果一个图像的直方图都集中在一个区域,那么整体图像的对比度比较小,不便于图像中纹理的识别。例如,如果相邻的两个像素灰度值分别是 120 121 ,那么仅凭肉眼是无法区别出来的。同时,如果图像中所有的像素灰度值都集中在 100 150 ,那么整个图像会给人模糊的感觉,看不清图中的内容。如果通过映射关系,将图像中灰度值的范围扩大,增加原来两个灰度值之间的差值,就可以提高图像的对比度,进而将图像中的纹理突出显现出来,这个过程称为图像直方图均衡化。
        在 OpenCV 4 中,提供了 equalizeHist() 函数用于将图像的直方图均衡化,该函数的原型在代码清单 4-7 中给出。

1.1 equalizeHist()函数原型

void cv::equalizeHist(InputArray src, OutputArray dst )
  • src:需要直方图均衡化的 CV_8UC1 图像。
  • dst:直方图均衡化后的输出图像,与src具有相同尺寸和数据类型。 
        该函数只能对单通道的灰度图进行直方图均衡化 。通过结果可以发现,经过均衡化后的图像对比度明显增加,可以看清楚原来看不清的纹理。通过绘制原图和均衡化后的图像直方图可以发现,均衡化后的图像直方图分布更加均匀。

1.2 示例程序

#include <opencv2/opencv.hpp> 
#include <iostream> 

using namespace cv; 
using namespace std; 

void drawHist(Mat &hist, int type, string name) //归一化并绘制直方图函数
{ 
    int hist_w = 512; 
    int hist_h = 400; 
    int width = 2; 
    Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3); 
    normalize(hist, hist, 1, 0, type, -1, Mat()); 
    for (int i = 1; i <= hist.rows; i++) 
    { 
        rectangle(histImage, Point(width*(i - 1), hist_h - 1), 
        Point(width*i - 1, hist_h - cvRound(hist_h*hist.at<float>(i - 1)) - 1), 
        Scalar(255, 255, 255), -1); 
    } 
    imshow(name, histImage);
} 
 //主函数
int main() 
{ 
    Mat img = imread("../pic/gril.jpg"); 
    if (img.empty()) 
    { 
        cout << "请确认图像文件名称是否正确" << endl; 
        return -1; 
    } 
    Mat gray, hist, hist2; 
    cvtColor(img, gray, COLOR_BGR2GRAY); 
    Mat equalImg; 
    equalizeHist(gray, equalImg); //将图像直方图均衡化
    const int channels[1] = { 0 }; 
    float inRanges[2] = { 0,255 }; 
    const float* ranges[1] = { inRanges }; 
    const int bins[1] = { 256 }; 
    calcHist(&gray, 1, channels, Mat(), hist, 1, bins, ranges); 
    calcHist(&equalImg, 1, channels, Mat(), hist2, 1, bins, ranges); 
    drawHist(hist, NORM_INF, "hist"); 
    drawHist(hist2, NORM_INF, "hist2"); 
    imshow("原图", gray); 
    imshow("均衡化后的图像", equalImg); 
    waitKey(0); 
    return 0; 
}

1.3 测试结果 

2.  直方图反向投影

 2.1 calcBackProject()函数原型

void cv::calcBackProject(const Mat * images, 
int nimages, 
const int * channels, 
InputArray hist, 
OutputArray backProject, 
const float ** ranges, 
double scale = 1, 
bool uniform = true 
)
  • images:待统计直方图的图像数组,数组中所有的图像应具有相同的尺寸和数据类型,并且数据类型只能是 CV_8U、CV_16U 和 CV_32F 这 3 种中的一种,但是不同图像的通道数可以不同。
  • nimages:输入图像数量。
  • channels:需要统计的通道索引数组,第一个图像的通道索引从 0 到 images[0].channels()−1,第二个图像通道索引从 images[0].channels()到 images[0].channels()+ images[1].channels()−1,依次类推。
  • hist:输入直方图。
  • backProject:目标为反向投影图像,与 images[0]具有相同尺寸和数据类型的单通道图像。
  • ranges:每个图像通道中灰度值的取值范围。
  • scale:输出反向投影矩阵的比例因子。
  • uniform:直方图是否均匀的标志符,默认状态下为均匀(true)。 

2.2 示例代码

#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>

using namespace std;
using namespace cv;

//定义全局变量
Mat srcImage, hsvImage,hueImage;
const int hueBinMaxValue = 180;
int hueBinValue=25;

//声明回调函数
void Hist_and_Backprojection(int, void*);

int main()
{
    srcImage=imread("../pic/hand.jpg");

    //判断图像是否加载成功
    if(srcImage.empty())
    {
        cout << "图像加载失败" << endl;
        return -1;
    }
    else
        cout << "图像加载成功..." << endl << endl;

    //将图像转化为HSV图像
    cvtColor(srcImage, hsvImage, COLOR_BGR2HSV);

    //只使用图像的H参数
    hueImage.create(hsvImage.size(), hsvImage.depth());
    int ch[]={0,0};
    mixChannels(&hsvImage, 1, &hueImage, 1, ch, 1);

    //轨迹条参数设置
    char trackBarName[20];
    sprintf(trackBarName,"Hue bin:%d",hueBinMaxValue);
    namedWindow("SourceImage",WINDOW_AUTOSIZE);

    //创建轨迹条并调用回调函数
    createTrackbar(trackBarName, "SourceImage", &hueBinValue, hueBinMaxValue, Hist_and_Backprojection);
    Hist_and_Backprojection(hueBinValue, 0);

    imshow("SourceImage", srcImage);

    waitKey(0);

    return 0;
}

void Hist_and_Backprojection(int, void*)
{
    MatND hist;
    int histsize=MAX(hueBinValue, 2);
    float hue_range[]={0,180};
    const float* ranges={hue_range};

    //计算图像直方图并归一化处理
    calcHist(&hueImage, 1, 0, Mat(), hist, 1, &histsize, &ranges, true, false);
    normalize(hist, hist, 0, 255, NORM_MINMAX, -1, Mat());

    //获取反向投影
    MatND backProjection;
    calcBackProject(&hueImage, 1, 0, hist, backProjection, &ranges, 1, true);

    //输出反向投影
    imshow("BackProjection", backProjection);

    //绘制图像直方图
    // int w=400;
    // int h=400;
    // int bin_w = cvRound((double)w/histsize);
    // Mat histImage = Mat::zeros(w, h, CV_8UC3);
    // for(int i=0; i < hueBinValue; i++)
    // {
    //     rectangle(histImage, Point(i*bin_w, h), Point((i+1)*bin_w, h-cvRound(hist.at<float>(i)*h/255.0)), Scalar(0,0,255), -1);
    // }
    //imshow("HistImage", histImage);
}

2.3 测试结果

 

 

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

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

相关文章

音频提取软件分享:6款好用音频提取工具推荐

在现代数字媒体中&#xff0c;音频提取已经成为一项至关重要的技能。无论你是视频创作者、播客主持人&#xff0c;还是音乐爱好者&#xff0c;从视频、电影或其他多媒体文件中提取音频&#xff0c;都是一项非常有用的操作。 本文将围绕音频提取&#xff0c;介绍这项技术的应用、…

一篇文章带你实现大模型及RAG入门---小白速进

项目概述&#xff1a;随着人工智能技术的飞速发展&#xff0c;大模型&#xff08;Large Models&#xff09;和检索增强型生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;已成为自然语言处理&#xff08;NLP&#xff09;领域的热点。大模型以其强大的理解和生…

Java二十三种设计模式-责任链模式(17/23)

责任链模式&#xff1a;实现请求处理的灵活流转 引言 在这篇博客中&#xff0c;我们深入探讨了责任链模式的精髓&#xff0c;从其定义和用途到实现方法&#xff0c;再到使用场景、优缺点、与其他模式的比较&#xff0c;以及最佳实践和替代方案&#xff0c;旨在指导开发者如何…

力扣第 411 场周赛题解

3258. 统计满足 K 约束的子字符串数量 I 给你一个 二进制 字符串 s 和一个整数 k。 如果一个 二进制字符串 满足以下任一条件&#xff0c;则认为该字符串满足 k 约束&#xff1a; 字符串中 0 的数量最多为 k。字符串中 1 的数量最多为 k。 返回一个整数&#xff0c;表示 s …

系统编程-进程初步1

5 进程初步 一、认识进程 -- 进程Process是指计算机中已运行的程序&#xff0c;是系统进行资源分配和调度的基本单位&#xff0c;是操作系统结构的基础 -- 程序运行起来就是一个进程 进程存在于运行内存中程序存在于硬盘中 -- windows下查看进程使用任务管理器进行查看 1…

EXCEL——Vlookup17个高级用法

大纲 一、基本语法 1、参数详解 二、入门篇 1、单条件查找 2、屏蔽查找返回的错误值 三、进阶篇 1、反向查找 2、包含查找 3、区间查找 4、含通配符查找 5、多列查找 6、多区域查找 四、高级篇 1、多条件查找 2、合并单元格查找 3、带合并单元格的多条件查找 …

轻松玩转音频剪辑:推荐四大必备工具!

在这个多媒体时代&#xff0c;音频剪辑技能变得至关重要。无论是制作短视频、音频节目&#xff0c;还是音乐创作&#xff0c;一款得心应手的音频剪辑工具都能让你事半功倍。今天&#xff0c;我们将推荐几款热门音频剪辑工具&#xff0c;助你轻松玩转声音世界 福昕音频剪辑 链…

【数学建模】趣味数学模型——等额还款数学模型

问题 在银行贷款中&#xff0c;通常采用等额还款。假定银行贷款的年利率为 p&#xff0c;贷款 k 元&#xff0c;分 m 年采用每月等额还款方式还清。问每月还款多少钱&#xff1f;总共还的钱是多少&#xff1f;每月还款中还本金和利息各是多少元&#xff1f; 如果考虑每月等额…

Webrtc之SDP协议

SDP简介 SDP 最常用于 RTC 实时通话的协商过程&#xff0c;在 WebRTC 中&#xff0c;通信双方在连接阶段使用 SDP 来协商后续传输过程中使用的音视频编解码器(codec)、主机候选地址、网络传输协议等。 在实际的应用过程中&#xff0c;通信双方可以使用 HTTP、WebSocket、Data…

MySQL数据库主从复制

主从复制原理 MySQL的复制类型 基于语句的复制 &#xff08;默认&#xff09;基于行的复制混合类型的复制MySQL主从复制的工作过程 主从复制设置 主从复制时基于二进制文件的所以需要打开二进制文件 主数据库 在MySQL配置文件/etc/my.cnf修改或增加 #启用了MySQL的二进制日…

集合及数据结构第三节————包装类和简单认识泛型

系列文章目录 集合及数据结构第三节————包装类和简单认识泛型 包装类和简单认识泛型 基本数据类型和对应的包装类装箱和拆箱泛型泛型类的使用裸类型(Raw Type) &#xff08;了解&#xff09;泛型如何编译的泛型的上界泛型方法 文章目录 系列文章目录集合及数据结构第三节…

linux上常见问题

1.普通用户下&#xff0c;不能使用sudo 解决方法 1.切换到root用户下执行该指令是没有问题的 2.更改配置文件sudoers 1.进入root用户下&#xff1a;su - 2.编辑sudoers :visudo 此时就打开了一个文件 3.在该文件找到这么一行内容&#xff1a;root ALL(ALL) ALL 4.在该行的…

CUDA-MODE课程笔记 第8课: CUDA性能检查清单

我的课程笔记&#xff0c;欢迎关注&#xff1a;https://github.com/BBuf/how-to-optim-algorithm-in-cuda/tree/master/cuda-mode CUDA-MODE课程笔记 第8课: CUDA性能检查清单 课程笔记 这节课实际上算是CUDA-MODE 课程笔记 第一课: 如何在 PyTorch 中 profile CUDA kernels 这…

(16)prometheus(普罗米修斯)监控的搭建

prometheus是由go语言编写的&#xff0c;监控服务器是否正常运行的工具&#xff0c;使用experter工具收集数据&#xff0c;传到prometheus服务器。可以结合grafana图形化和pagerduty报警发送有邮件和信息。 实验环境&#xff1a; 关掉防火墙和selinux grafana.example.com 1…

为什么CNAPP将会是网络安全领域的一场革命?

随着越来越多的组织开始业务上云&#xff0c;云原生应用保护变得越来越复杂。众多高度碎片化产品&#xff0c;很难去保护一个广泛的、动态变化的攻击场景。当前想要解决这一难题&#xff0c;有一个很好的思路&#xff0c;就是云原生应用保护平台&#xff08;CNAPP&#xff09;。…

第二届机器人与软件工程前沿国际会议在贵阳闭幕

2024年8月13日&#xff0c;第二届机器人与软件工程前沿国际会议&#xff08;FRSE 2024&#xff09;在贵阳圆满闭幕。 本次大会由长沙理工大学主办&#xff0c;贵州大学、湖南科技大学、爱迩思出版社&#xff08;ELSP&#xff09;&#xff0c;ESBK国际学术交流中心、AC学术平台…

Python 办公自动化 处理 Excel 数据 【1】推荐

话说学好办公自动化,走遍天下都不怕&#xff01;&#xff01;&#xff01; 好的&#xff0c;现在开始。 因为是一些办公自动化的应用场景&#xff0c;所以需要电脑支持excel、word和ppt以及python的运行环境。 如果有电脑不支持Excel word ppt的以及python环境下载安装配置可…

Spring 声明式事务 @Transactional

目录 一、添加依赖 二、Transactional 作用 三、Transactional详解 3.1 rollbackFor 3.2 事务隔离级别 3.3 Spring 事务传播机制 Spring 声明式事务 Transactional的使用很简单&#xff0c;只需要添加依赖&#xff0c;在需要的方法或者类上添加 Transactional注解即可。 …

珠海盈致联手深圳盈怡成功上线“混工单柔性智能生产装备”

珠海盈致联手深圳盈怡推出的“混工单柔性智能生产装备”在全面而严密的市场测试中显示出卓越的性能和极高的用户满意度。 经过两年的精细研发和内部测试优化&#xff0c;该柔性生产线已成功完成了样板工厂的所有环节&#xff0c;在深圳市贤丰科技有限公司成功试跑上线&#xf…

联影医疗笔试考什么?如何通过联影在线测评|附真题库面试攻略

职小豚 一、联影医疗公司介绍 嘿&#xff0c;朋友们&#xff01;今天咱们来聊聊联影医疗这家在医疗领域大放异彩的企业。 联影医疗&#xff0c;那可是医疗科技界的一颗璀璨明星&#xff01;它就像一位勇敢的探索者&#xff0c;在医疗影像设备的研发和创新道路上不断前行。 联…