OpenCV2:小学篇 图像灰度变换技术-直方图处理
一.简介
在一个单通道的灰度图像中,每个像素的值介于0(黑色)~255(白色)之间,灰色图像的直方图有256个条目(或称为容器)
二.灰度直方图
图像由像素点构成,灰度直方图用来描述图像中各个灰度级的像素个数(该灰度级像素出现的频率),灰度直方图的横坐标表示灰度级,纵坐标表示图像中该灰度级出现的次数(频率)
对于灰度图像,其灰度阶256级变换范围为0~256
void calcHist(
const Mat* images,
int nimages,
const int* channels,
InputArray mask,
OutputArray hist,
int dims,
const int* histSize,
const float** ranges,
bool uniform = true,
bool accumulate = false)
#include <opencv2\opencv.hpp> int main() { // 图像源获取及判断 cv::Mat Image,ImageGray; Image = cv::imread("a.jpg"); if (Image.empty()) return -1; cv::imshow("Image", Image); // 转换为灰度图像 cv::cvtColor(Image, ImageGray, CV_BGR2GRAY); // 定义直方图参数 const int channels[1] = {0}; const int histSize[1] = {256}; float pranges[2] = {0, 255}; const float* ranges[1] = {pranges}; cv::MatND hist; // 计算直方图 cv::calcHist(&ImageGray, 1, channels, cv::Mat(), hist, 1, histSize, ranges); // 初始化画布参数 int hist_w = 500; int hist_h = 500; int nHistSize = 255; // 区间 int bin_w = cvRound((double)hist_w / nHistSize); cv::Mat histImage(hist_w, hist_h, CV_8UC3, cv::Scalar(0, 0, 0)); // 将直方图归一化 normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat()); // 在直方图画布上画出直方图 for (int i = 1; i < nHistSize; i++) { line(histImage, cv::Point(bin_w * (i - 1),hist_h - cvRound(hist.at<float>(i-1)) ), cv::Point(bin_w * (i), hist_h - cvRound(hist.at<float>(i))), cv::Scalar(0, 0, 255), 2, 8, 0); } // 显示直方图 cv::imshow("histImage", histImage); cv::waitKey(0); return 0; }
三.H-S直方图
四.RGB直方图
五.自定义直方图
六.灰度直方图均衡
七.彩色直方图均衡
八.直方图变换查找
九.直方图变换累计
十.直方图匹配
十一.直方图对比
十二.直方图反向投影
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)