图像处理学习笔记之直方图的计算与绘制

更新时间:2023-07-20 18:19:48 阅读: 评论:0

图像处理学习笔记之直⽅图的计算与绘制
图像直⽅图包含丰富的图像细节信息,反映了图像像素点的概率分布情况,它统计了每⼀个强度值具有的像素个数。灰度级范围是[0,L-1]的数字图像的直⽅图是离散函数h(rk)=nk,其中是rk第k级灰度值,nk是图像中灰度为rk的像素个数。在实践中,经常⽤乘积MN表⽰的图像像素总数除它的每个分量来归⼀化直⽅图,M、N是图像的⾏列数。因此归⼀化后的直⽅图由p(rk)=nk/MN给出。直⽅图的横坐标表⽰灰度级,纵坐标表⽰图像中该灰度级出现的次数(频率)。
⼀般来说,在暗图像中,直⽅图的分量集中在灰度级较低的⼀侧。亮图像的直⽅图分量集中在灰度级值较⾼的⼀侧。低对⽐度的图像具有较窄的直⽅图,且集中于灰度级的中部。⾼对⽐度的图像中直⽅图的分量覆盖了很宽的灰度级范围。
图1 亮图像及其灰度直⽅图
樱花公主
图2 暗图像及其灰度直⽅图
图3 ⾼对⽐度图像及其灰度直⽅图
图4 低对⽐度图像及其灰度直⽅图
opencv中提供了calchist函数⽤于计算图像的直⽅图。其声明如下:
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=fal );
arrays:源输⼊图像数组,可以是多幅图像,所有的图像必须有同样的深度(CV_8U or CV_32F),同时⼀副图像可以有多个
channes。
narrays:源输⼊数组中的元素个数
channels:⽤来计算直⽅图的通道维数数组,第⼀个数组的通道由0到arrays[0].channels()-1列出,第⼆个数组的通道从
arrays[0].channels()到arrays[0].channels()+arrays[1].channels()-1以此类推
mask:可选的掩膜,如果该矩阵不是空的,则必须是8位的并且与arrays[i]的⼤⼩相等,掩膜的⾮零值标记需要在直⽅图中统计的数组元素;
hist:输出直⽅图,是⼀个稠密或者稀疏的dims维的数组
dims:直⽅图的维数,必须为正,并且不⼤于CV_MAX_DIMS(当前的OpenCV版本中为32,即最⼤可以统计32维的直⽅图); histSize:⽤于指出直⽅图数组每⼀维的⼤⼩的数组,即指出每⼀维的bin的个数的数组
布艺手工ranges:⽤于指出直⽅图每⼀维的每个bin的上下界范围数组的数组,当直⽅图是均匀的(uniform =true)时,对每⼀维i指定直⽅图的第0个bin的下界(包含即[)L0和最后⼀个即第histSize[i]-1个bin的上界
(不包含的即))U_histSize[i]-1,也就是说对均匀直⽅图来说,每⼀个ranges[i]都是⼀个两个元素的数组【指出该维的上下界】。当直⽅图不是均匀的时,每⼀个ranges[i]数组都包含histSize[i]+1个元素:L0,U0=L1,U1=L1,...,U_histSize[i]-2 = L_histSize[i]-1,U_histSize[i]-1.不在L0到U_histSize[i]-1之间的数组元素将不会统计进直⽅图中
uniform:直⽅图是否均匀的标志;【指定直⽅图每个bin统计的是否是相同数量的灰度级】
蓝屏是什么原因accumulate:累加标
丙谷转氨酶偏高
int main()
{
Mat src, dst;
src = imread("1.jpg");
if (!src.data)
{
return -1;
}
/// 通道分离
vector<Mat> bgr_planes;
split(src, bgr_planes);
int histSize = 256;
/// 设置范围
float range[] = { 0, 256 };
经典名人名言名句
const float* histRange = { range };
bool uniform = true; bool accumulate = fal;
Mat b_hist, g_hist, r_hist;
/
// 计算直⽅图:
calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, &histRange, uniform, accumulate);
calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, &histRange, uniform, accumulate);
// 创建画布
int hist_w = 512; int hist_h = 400;
int bin_w = cvRound((double)hist_w / histSize);
Mat histImage(hist_h, hist_w, CV_8UC3, Scalar(0, 0, 0));
/// 归⼀化到 [ 0, ws ]
normalize(b_hist, b_hist, 0, ws, NORM_MINMAX, -1, Mat());
normalize(g_hist, g_hist, 0, ws, NORM_MINMAX, -1, Mat());
normalize(r_hist, r_hist, 0, ws, NORM_MINMAX, -1, Mat());
/// 画直⽅图
for (int i = 1; i < histSize; i++)
{
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),
Point(bin_w*(i), hist_h - cvRound(b_hist.at<float>(i))),
Scalar(255, 0, 0), 2, 8, 0);
数独玩法line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),
Point(bin_w*(i), hist_h - cvRound(g_hist.at<float>(i))),
Scalar(0, 255, 0), 2, 8, 0);
line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),
Point(bin_w*(i), hist_h - cvRound(r_hist.at<float>(i))),
来源英语
Scalar(0, 0, 255), 2, 8, 0);
}
namedWindow("calcHist Demo", CV_WINDOW_AUTOSIZE);
imshow("calcHist Demo", histImage);
waitKey(0);
return 0;
}
长征胜利80周年
以下是使⽤QChart进⾏直⽅图显⽰的代码。对彩⾊图像分通道处理,当⿏标移动到指定位置时,还可以显⽰横纵坐标。

本文发布于:2023-07-20 18:19:48,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1089425.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   数组   灰度级   掩膜   像素   个数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图