5.9灰度直方图

2024-09-05 10:12
文章标签 直方图 5.9 灰度

本文主要是介绍5.9灰度直方图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

实验原理

实验代码

运行结果


实验原理

calcHist 函数通常是指在计算机视觉和图像处理中用于计算图像直方图的一个函数。

cv:calcHist () 用于计算一个或多个数组的直方图。它可以处理图像数据并返回一个表示像素强度分布的向量(对于灰度图像)或颜色分布(对于彩色图像)。用于计算一个或多个数组的直方图。它可以处理图像数据并返回一个表示像素强度分布的向量(对于灰度图像)或颜色分布(对于彩色图像)。

calcHist 函数原型

C++: void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, OutputArray hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false );C++: void calcHist(const Mat* arrays, int narrays,const int* channels, InputArray mask, SparseMat& hist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false );参数解释:
arrays: 指向输入图像数组的指针。这些数组通常是图像数据。
narrays: 输入数组的数量。
channels: 指定要处理的通道索引数组。对于每个输入数组,可以指定一个或多个通道。表示要处理的图像通道数。例如,在 RGB 图像中,[0] 表示蓝色通道,[1] 表示绿色通道,[2] 表示红色通道。
mask:  可选的掩码,用于指定感兴趣的区域(ROI)。如果未提供掩码,则使用整个输入数组(整个图像)。
hist: 输出直方图。可以是一个密集矩阵 (OutputArray) 或稀疏矩阵 (SparseMat)。
dims: 直方图的维度数量。对于单通道直方图,维度为 1;对于多通道直方图,维度等于通道数量。
histSize: 每个维度上的直方图区间数量(bins 数量)。
ranges:  每个维度上的直方图区间范围。通常是一个包含两个元素的数组,表示区间起始值和结束值。
uniform : 如果为 true,则 ranges 是均匀间隔的。默认为 true。
accumulate: 如果为 true,则将计算出的直方图累加到已有的 hist 上;如果为 false,则覆盖 hist。默认为 false。说明
calcHist 函数用于计算一个或多个数组的直方图。它可以处理图像数据,并生成一个表示像素强度分布(对于灰度图像)或颜色分布(对于彩色图像)的直方图。密集直方图 (OutputArray hist): 当输出为密集矩阵时,hist 将是一个包含直方图数据的一维或多维矩阵。
稀疏直方图 (SparseMat& hist): 当输出为稀疏矩阵时,hist 将是一个稀疏矩阵,适用于数据稀疏的情况。
你可以根据需要选择密集矩阵或稀疏矩阵作为输出,以便优化内存使用和处理速度。

实验代码

#include "pch.h"
#include <iostream>
#include<opencv2/opencv.hpp>
#include <opencv2\imgproc\types_c.h> //for CV_RGB2GRAY
using namespace cv;  //所有opencv类都在命名空间cv下
using namespace std;
//#pragma comment(lib, "opencv_world450d.lib")  //引用引入库 
//绘制灰度直方图
int main()
{Mat src, gray;src = imread("027.jpeg");  //读取工程目录下的图片if (src.empty()) //判断原图是否加载成功{cout << "图像加载失败" << endl;return -1;}cvtColor(src, gray, CV_RGB2GRAY);   //转换为灰度图int bins = 256;  //定义直方图的参数,包括 bin 数量(这里是256),范围是从0到256,表示灰度级的范围。 定义直方图的 bins 数量 bins 变量定义了直方图的 bins(区间)数量。在这里,我们设置为 256,意味着我们将灰度值区间 [0, 255] 分成 256 个等宽的小区间。int hist_size[] = { bins };//定义直方图尺寸 hist_size 是一个整数数组,用于指定直方图的尺寸。在这里,只有一个维度(因为我们计算的是单通道直方图),尺寸为 bins。float range[] = { 0, 256 };//定义直方图范围 range 是一个浮点数数组,用于指定直方图的范围。在这里,我们设置了从 0 到 256 的范围,这是因为我们的灰度值是从 0 到 255。const float* ranges[] = { range }; //定义直方图的范围指针数组 ranges 是一个指针数组,其中包含了指向 range 的指针。这是因为 calcHist 函数需要一个指针数组来接收每个维度的范围。在这种情况下,我们只有一个维度,所以只需要一个指针。MatND hist;//定义输出直方图矩阵,hist 是一个 MatND 类型的变量,用于存储计算得到的直方图数据。MatND 是一个多维矩阵类型,可以存储任意维度的数据。在这里,它是一个一维的直方图数据。int channels[] = { 0 }; //定义通道索引数组 channels 是一个整数数组,用于指定要处理的图像通道。在这里,我们只处理第一个通道(即灰度图像的唯一通道),索引为 0。//计算出灰度直方图calcHist(&gray, 1, channels, Mat(), // do not use maskhist, 1, hist_size, ranges,true, // the histogram is uniformfalse);//画出直方图double max_val;minMaxLoc(hist, 0, &max_val, 0, 0);  //定位矩阵中最小值、最大值的位置int scale = 2;//scale 是一个缩放因子,用于调整直方图图像的宽度。int hist_height = 256;//hist_height 是直方图图像的高度。在这个例子中,hist_height 被设定为 256。Mat hist_img = Mat::zeros(hist_height, bins*scale, CV_8UC3); //创建一个全0的特殊矩阵
//bins * scale 计算了直方图图像的宽度,即 256 * 2 = 512。
//这行代码创建了一个高度为 hist_height(256)、宽度为 bins * scale(512)的三通道 RGB 图像。所有的像素都被初始化为黑色(因为所有通道的值都是 0)。for (int i = 0; i < bins; i++){float bin_val = hist.at<float>(i); //获取当前 bin (i) 的值。int intensity = cvRound(bin_val*hist_height / max_val);  //要绘制的高度 计算当前 bin 在图像上应绘制的高度。rectangle(hist_img, Point(i*scale, hist_height - 1),  //画矩形Point((i + 1)*scale - 1, hist_height - intensity),CV_RGB(255, 255, 255));
//使用 rectangle 函数在 hist_img 上绘制一个矩形,表示当前 bin 的直方图柱状图。矩形的位置和高度决定了直方图的形状:
//注意此处的原点坐标 位于左上角
//左下角位于 (i*scale, hist_height - 1)。
//右上角位于 ((i + 1)*scale - 1, hist_height - intensity)。
//每个 bin 的宽度为 scale 个像素,高度为 intensity 像素,颜色为白色。}//显示原图和直方图namedWindow("原图片", WINDOW_NORMAL);imshow("原图片", src);namedWindow("灰度图片", WINDOW_NORMAL);imshow("灰度图片", gray);namedWindow("灰度直方图", WINDOW_NORMAL);imshow("灰度直方图", hist_img);waitKey(0);return 0;
}

运行结果

示例扩展

尚需后续调整完善

//#include <cv.h>
//#include <highgui.h>
#include "pch.h"
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;using namespace cv;int main(int argc, char** argv)
{Mat src, hsv;src = imread("A.jpg");if (src.empty()) //判断原图是否加载成功{cout << "图像加载失败" << endl;return -1;}cvtColor(src, hsv, CV_BGR2HSV);// Quantize the hue to 30 levels// and the saturation to 32 levelsint hbins = 30, sbins = 32;int histSize[] = { hbins, sbins };// hue varies from 0 to 179, see cvtColorfloat hranges[] = { 0, 180 };// saturation varies from 0 (black-gray-white) to// 255 (pure spectrum color)float sranges[] = { 0, 256 };const float* ranges[] = { hranges, sranges };MatND hist;// we compute the histogram from the 0-th and 1-st channelsint channels[] = { 0, 1 };calcHist(&hsv, 1, channels, Mat(), // do not use maskhist, 2, histSize, ranges,true, // the histogram is uniformfalse);double maxVal = 0;minMaxLoc(hist, 0, &maxVal, 0, 0);int scale = 10;Mat histImg = Mat::zeros(sbins*scale, hbins * 10, CV_8UC3);for (int h = 0; h < hbins; h++)for (int s = 0; s < sbins; s++){float binVal = hist.at<float>(h, s);int intensity = cvRound(binVal * 255 / maxVal);rectangle(histImg, Point(h*scale, s*scale),Point((h + 1)*scale - 1, (s + 1)*scale - 1),Scalar::all(intensity),CV_FILLED);}namedWindow("Source", 1);imshow("Source", src);namedWindow("H-S Histogram", 1);imshow("H-S Histogram", histImg);waitKey();
}

这篇关于5.9灰度直方图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1138670

相关文章

有无直方图,性能的差距

################################# ###有无直方图,性能的差距### ################################# 实验的环境在redhat平台下的11gr2单实例环境 1、在自己定义的用户下创建表及索引 CREATE TABLE customers AS SELECT * FROM sh.customers; CREATE INDEX cu

k8s灰度/金丝雀发布

灰度及蓝绿发布是为新版本服务创建一个与老版本服务完全一致的生产环境,在不影老版本服务的前提下,按照一定的规则把部分流量切换到新版本,当新版本试运行一段时间没有问题后,将用户的全量流量从老版本迁移至新版本。         灰度发布的方式通常用于AB测试,是指一部分用户继续使用老版本的服务,将一部分用户的流量切换到新版本,如果新版本运行稳定,则逐步将所有用户迁移到新版本。

CUDA:用并行计算的方法对图像进行直方图均衡处理

(一)目的 将所学算法运用于图像处理中。 (二)内容 用并行计算的方法对图像进行直方图均衡处理。 要求: 利用直方图均衡算法处理lena_salt图像 版本1:CPU实现 版本2:GPU实现  实验步骤一 软件设计分析: 数据类型: 根据实验要求,本实验的数据类型为一个256*256*8的整型矩阵,其中元素的值为256*256个0-255的灰度值。 存储方式: 图像在内存中

图像处理:基于直方图矫正的图像色彩均衡

from itertools import chainimport cv2import osimport numpy as npimport datetimeclass BrightnessBalance:def __init__(self):passdef arrayToHist(self,gray):'''计算灰度直方图,并归一化:param gray_path::return:'''

python画图|并列直方图绘制

前述学习过程中,已经知晓普通直方图绘制和堆叠直方图绘制,参考链接如下: 西猫雷婶-CSDN博客 有时候,我们还会遇到并列直方图绘制的需求,今天就探索一下。 【1】官网教程 按照惯例,我们先来到官网: https://matplotlib.org/stable/gallery/lines_bars_and_markers/barchart.html#sphx-glr-gallery-lin

RGB色转为灰度色算法-img2ascii_char

一、基础   对于彩色转灰度,有一个很著名的心理学公式: Gray = R0.299 + G0.587 + B0.114 二、整数算法   而实际应用时,希望避免低速的浮点运算,所以需要整数算法。   注意到系数都是3位精度的没有,我们可以将它们缩放1000倍来实现整数运算算法: Gray = (R299 + G587 + B114 + 500) / 1000   RGB一般是8位精度,现在缩放1

庞峰Opencv学习(三)--灰度直方图

灰度直方图是一个帮助分析图像很有力的工具吧,今天学习了下,一天不敲代码就生疏啊- -   灰度直方图这个程序主要有几个函数和结构体先说一下:   1.  CreateHIst          CvHistogram* cvCreateHist( int dims, int* sizes, int type,  float** ranges=NULL, int uniform=1 );

聊聊灰度发布

有没有在北京面试java的小伙伴,每家公司面试问的问题都不一样,昨天面试官问到了灰度发布,一脸懵,好像在哪儿听说过,毕竟我都没发布过,之前都是项目组长在干这些事儿,所以聊聊,了解一下 什么是灰度发布 全量发布:把旧服务kill掉,把新服务启动,这个过程就可以理解为全量发布 回滚周期长 如果我们更新完应用之后,我们做线上回归测试的时候发现有BUG,这个时候就要做回滚,过程就是把新服

Opencv中的直方图(5)计算EMD距离的函数EMD()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 计算两个加权点配置之间的“最小工作量”距离。 该函数计算地球搬运工距离(Earth Mover’s Distance)和/或两个加权点配置之间距离的下界。其中一个应用如文献 225和 226中所述,是在图像检索中进行多维直方图比较。EMD 是

电赛2024年H题智能小车基于MSPM0G3507主控MCU(利用8路灰度加上MPU6050的解决方式)具体项目报告

题目:自动行驶小车(H题) 摘要 本项目由微处理器MSPM0G3507,编码器电机驱动,8路灰度传感器指示线巡线单元,MPU6050六轴传感器无线直行单元,OLED显示人机互动单元,红色LED及蜂鸣器声光提示单元构成。系统运行由两部分组成:自动行驶小车的无指示线直行控制部分和有指示线弯道行驶的实时转向控制部分,小车的无指示线直行控制部分,由MPU6050六轴传感器获得小车姿态的偏航角,通过获得