当前位置: 首页 > news >正文

十年前网站开发语言深圳市建设交易网站

十年前网站开发语言,深圳市建设交易网站,厦门做医院网站设计的公司,新房文章目录 opencv图像的直方图#xff0c;二维直方图#xff0c;直方图均衡化一、图像的直方图1、什么是图像的直方图#xff1a;2、直方图的作用#xff1a;3、如何绘制图像的直方图#xff1a;#xff08;1#xff09;cv::calcHist()函数原型#xff1a;英文单词 calc… 文章目录 opencv图像的直方图二维直方图直方图均衡化一、图像的直方图1、什么是图像的直方图2、直方图的作用3、如何绘制图像的直方图1cv::calcHist()函数原型英文单词 calculator histogram2代码示例cv::cvRound()函数将浮点数值四舍五入为最接近的整数灰度图像直方图彩色图像直方图 二、二维直方图1、什么是二维直方图2、二维直方图与直方图有哪些不同3、二维直方图的作用4、如何绘制二维直方图 三、直方图均衡化1、直方图均衡化的原理2、opencv中可以使用 cv::equalizeHist()函数来实现直方图均衡化1cv::equalizeHist()函数原型2代码示例灰度直方图均衡化彩色直方图均衡化 opencv图像的直方图二维直方图直方图均衡化 一、图像的直方图 1、什么是图像的直方图 要理解直方图绕不开“亮度”这个概念人们把亮度分为0到255共256个数值数值越大代表的亮度越高其中0代表纯黑色最暗区域255表示最亮纯白色而中间的数字就是不同亮度的灰色图像的直方图是一种统计图它显示了图像中各个灰度级别的分布情况(也就是统计一幅图某个亮度像素的数量)通常它的横轴代表像素的灰度级别从0到255而纵轴代表该灰度级别在图像中出现的频次或概率 2、直方图的作用 可视化图像亮度分布直方图能够帮助我们直观地了解图像的亮度分布情况从而为图像处理提供重要参考对比度调整通过观察直方图我们可以确定图像的对比度是否合适从而决定是否需要进行对比度调整灰度级别选择直方图可以帮助我们选择合适的灰度级别以使图像的细节更加清晰 3、如何绘制图像的直方图 在opencv中可以使用 cv::calcHist()函数来计算图像的直方图这个函数可以接受一个通道的图像(灰度图像)或多个通道的图像(彩色图像) 1cv::calcHist()函数原型英文单词 calculator histogram void cv::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 );参数解释 images输入图像可以是单通道或多通道图像 nimages输入图像的个数(可以输入多张图像) channels需要统计直方图的第几通道比如{0}表示统计第一个通道{0, 1, 2}表示统计所有三个通道 mask掩膜用于指定计算直方图的区域(必须是一个8位(CV_8U)的数组并且和images的数组大小相同) hist输出的直方图数组calcHist函数只是计算直方图的数据直方图数据需要一个cv::Mat类型的变量来存储 dims输出直方图的维度(由channels值决定dims的数值比如int channels[] { 0 }则dims1int channels[] { 0, 1 }则dims2对于灰度图像dims为1因为我们只考虑了一个通道(亮度通道)对于彩色图像通常会考虑多个通道比如在HSV色彩空间中dims为2(H和S两个通道) ) histSize指的是直方图横坐标分成多少个区间就是bin的个数(用于控制直方图的精细度) 把直方图横坐标ranges分成histSize个区间(比如ranges180histSize30则横坐标被分成了30个小竖条每个小竖条的长度为6); ranges横轴代表像素的灰度级别ranges相当于横坐标的取值范围(对于灰度图像单通道只有1个range灰度级别的范围从0到255(int bins 256; // X轴被分成了256个小区间int histSize[] { bins }; // histSize只有1个binsfloat xRanges[] { 0, 256 }; // X轴的取值范围const float* ranges[] { xRanges }; // ranges只有1个)对于彩色图像有多个通道就有多个range对于每个通道ranges指定了取值范围通常在彩色图像中H(色相)的范围是0到180S(饱和度)和V(明度)的范围是0到255(// H通道X轴被分成了30个小区间S通道X轴被分成了32个小区间int hueBins 30, satBins 32; int histSize[] { hueBins, satBins }; // histSize有2个binsfloat hueRanges[] { 0, 180 }; // H通道X轴的取值范围float satRanges[] { 0, 256 }; // S通道X轴的取值范围const float* ranges[] { hueRanges, satRanges }; // ranges有2个) ) uniform是否对得到的直方图数组进行归一化处理 accumulate在多个图像时是否累积计算像素值的个数 2代码示例 cv::cvRound()函数将浮点数值四舍五入为最接近的整数 // 函数在图像处理过程中经常用于处理像素值特别是当需要将浮点数转换为整数时可以保留最接近的整数值 int cvRound(double value)参数解释 value待四舍五入的浮点数灰度图像直方图 #include opencv2\opencv.hpp #include iostream #include demo.husing namespace cv; using namespace std;int main() {// 读取灰度图像cv::Mat image cv::imread(C:\\cpp\\image\\suzy2.jpg, cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cerr Error: 无法读取图像文件. std::endl;return -1;}// 直方图计算的输出值是一个cv::Mat对象cv::Mat hist;// X轴被分成了256个小区间int bins 256;// 灰度图只有1个ranges所以histSize跟要ranges对应定义成1个int histSize[] { bins };// X轴的取值范围float xRanges[] { 0, 256 };// 在C中数组名本身就代表该数组的首地址无需使用取地址符号,// const float* ranges xRanges;const float* ranges[] { xRanges };// 我们要计算灰度图像的第0个通道所以这里channels定义成{0}int channels[] { 0 };calcHist(image, 1, channels, Mat(), hist, 1, histSize, ranges, true, false);// 待绘制的目标图像将直方图计算的输出值hist绘制到histImage图像上int histWidth 512, histHeight 400;int binWidth cvRound( (double)histWidth/bins );cv::Mat histImage(histHeight, histWidth, CV_8UC3, cv::Scalar(0, 0, 0));// 使用normalize()函数将直方图的值缩放到图像的高度范围内normalize(hist, hist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());// 使用cv::line()函数绘制直线for (int i 1; ibins; i) {cv::line(histImage,Point(binWidth*(i - 1), histHeight - cvRound(hist.atfloat(i - 1))),Point(binWidth*(i), histHeight - cvRound(hist.atfloat(i))),Scalar(255, 0, 0),2,LINE_8,0);}// 显示图像和直方图cv::imshow(Image, image);cv::imshow(Histogram, histImage);waitKey();return 0; } 运行结果 彩色图像直方图 对于彩色图像你可以分别计算其颜色通道(蓝色、绿色、红色)的直方图或者将其转换为灰度图像后计算整体的亮度直方图 在这个示例中我们首先读取了一个彩色图像然后使用 cv::split() 函数将图像分离成蓝色、绿色和红色通道接着我们分别计算了每个通道的直方图最后我们绘制了各个通道的直方图并显示了原始图像和直方图 #include opencv2\opencv.hpp #include iostream #include demo.husing namespace cv; using namespace std;int main() {// 读取彩色图像cv::Mat image cv::imread(C:\\cpp\\image\\suzy2.jpg);if (image.empty()) {std::cerr Error: 无法读取图像文件. std::endl;return -1;}// 分离通道std::vectorcv::Mat bgrPlanes;cv::split(image, bgrPlanes);// 直方图计算的输出值是一个cv::Mat对象cv::Mat bHist, gHist, rHist;int bins 256; // BGR通道X轴都被分成了256个小区间// B通道直方图计算// B通道灰度图只有1个ranges所以histSize跟要ranges对应定义成1个int bHistSize[] { bins };// B通道X轴的取值范围亮度级别float bXRanges[] { 0, 256 };// 在C中数组名本身就代表该数组的首地址无需使用取地址符号,// const float* ranges bXRanges;const float* bRanges[] { bXRanges };// 图像通道被分离后B通道图像只有一个通道第0个通道所以这里channels定义成{0}int bChannels[] { 0 };calcHist(bgrPlanes[0], 1, bChannels, Mat(), bHist, 1, bHistSize, bRanges, true, false);// G通道直方图计算// G通道灰度图只有1个ranges所以histSize跟要ranges对应定义成1个int gHistSize[] { bins };// G通道X轴的取值范围亮度级别float gXRanges[] { 0, 256 };// 在C中数组名本身就代表该数组的首地址无需使用取地址符号,// const float* ranges gXRanges;const float* gRanges[] { gXRanges };// 图像通道被分离后G通道图像只有一个通道第0个通道所以这里channels定义成{0}int gChannels[] { 0 };calcHist(bgrPlanes[1], 1, gChannels, Mat(), gHist, 1, gHistSize, gRanges, true, false);// R通道直方图计算// R通道灰度图只有1个ranges所以histSize跟要ranges对应定义成1个int rHistSize[] { bins };// R通道X轴的取值范围亮度级别float rXRanges[] { 0, 256 };// 在C中数组名本身就代表该数组的首地址无需使用取地址符号,// const float* ranges rXRanges;const float* rRanges[] { rXRanges };// 图像通道被分离后R通道图像只有一个通道第0个通道所以这里channels定义成{0}int rChannels[] { 0 };calcHist(bgrPlanes[2], 1, rChannels, Mat(), rHist, 1, rHistSize, rRanges, true, false);// 绘制直方图int histWidth 512, histHeight 400;int binWidth cvRound( (double)histWidth/bins );cv::Mat histImage(histHeight, histWidth, CV_8UC3, cv::Scalar(0, 0, 0));normalize(bHist, bHist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());normalize(gHist, gHist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());normalize(rHist, rHist, 0, histImage.rows, cv::NORM_MINMAX, -1, cv::Mat());for (int i 1; ibins; i) {// 绘制蓝色分量直方图cv::line(histImage,cv::Point( binWidth*(i-1), histHeight-cvRound( bHist.atfloat(i-1) ) ),cv::Point( binWidth*(i), histHeight-cvRound( bHist.atfloat(i) ) ),cv::Scalar(255, 0, 0),2,LINE_8,0);// 绘制绿色分量直方图cv::line(histImage,cv::Point( binWidth*(i - 1), histHeight-cvRound( gHist.atfloat(i-1) ) ),cv::Point( binWidth*(i), histHeight-cvRound( gHist.atfloat(i) ) ),cv::Scalar(0, 255, 0),2,LINE_8,0);// 绘制红色分量直方图cv::line(histImage,cv::Point( binWidth*(i - 1), histHeight-cvRound( rHist.atfloat(i-1) ) ),cv::Point( binWidth*(i), histHeight-cvRound( rHist.atfloat(i) ) ),cv::Scalar(0, 0, 255),2,LINE_8,0);}// 显示图像和直方图cv::imshow(Image, image);cv::imshow(Histogram, histImage);cv::waitKey(0);return 0;} 运行结果 二、二维直方图 1、什么是二维直方图 二维直方图是对彩色图像进行分析时的一个重要工具与一维直方图不同它同时考虑了两个通道的信息通常是颜色空间中的两个分量例如在HSV色彩空间中的H(色相)和S(饱和度) 2、二维直方图与直方图有哪些不同 维度直方图是一维的它只考虑了图像的亮度或色彩信息而二维直方图考虑了两个通道的信息因此是二维的通道直方图通常只针对一个通道(灰度图只有亮度通道)而二维直方图可以同时考虑多个通道通常是颜色空间中的两个分量 3、二维直方图的作用 颜色分布分析通过二维直方图我们可以了解图像中各个颜色组合的分布情况有助于理解图像的颜色特性图像分割与对象识别在图像分割和对象识别任务中二维直方图可用于将图像的颜色特征映射到特定的空间从而实现对图像中的对象进行定位和识别颜色调整与匹配通过分析二维直方图我们可以进行颜色调整使图像的颜色分布更加符合预期 4、如何绘制二维直方图 首先读取了一个彩色图像然后将其从BGR颜色空间转换为HSV颜色空间接着我们分离了H和S通道并指定了直方图的维度、通道数、亮度级别个数和范围然后我们使用 cv::calcHist()计算了二维直方图并使用 cv::rectangle()绘制 #include opencv2\opencv.hpp #include iostreamusing namespace cv; using namespace std;int main() {// 读取彩色图像cv::Mat image cv::imread(C:\\cpp\\image\\suzy2.jpg);if (image.empty()) {std::cerr Error: 无法读取图像文件. std::endl;return -1;}// 2D 直方图Mat hsv, hist;cvtColor(image, hsv, COLOR_BGR2HSV);// H通道X轴被分成了30个小区间S通道X轴被分成了32个小区间int hueBins 30, satBins 32;// 彩色图像有多个ranges所以histSize跟ranges对应也要定义多个定义成数组的形式int histSize[] { hueBins, satBins };float hueRanges[] { 0, 180 }; // H通道X轴的取值范围float satRanges[] { 0, 256 }; // S通道X轴的取值范围// 彩色图像有多个ranges定义成数组的形式const float* ranges[] { hueRanges, satRanges };// 我们要计算HSV图像的第0个通道和第1个通道的直方图所以这里channels也要定义多个int channels[] { 0, 1 };calcHist(hsv, 1, channels, Mat(), hist, 2, histSize, ranges, true, false);// 画出计算后的直方图double maxVal 0;minMaxLoc(hist, 0, maxVal, 0, 0);int scale 10;Mat histImage Mat::zeros(satBins*scale, hueBins*scale, CV_8UC3);for (int h0; hhueBins; h) {for (int s0; ssatBins; s){float binVal hist.atfloat(h, s);int intensity cvRound( binVal*255 / maxVal );rectangle(histImage, Point( h*scale, s*scale ),Point( (h1)*scale - 1, (s1)*scale - 1 ),Scalar::all(intensity),-1);}}applyColorMap(histImage, histImage, COLORMAP_JET);imshow(Image, image);imshow(H-S Histogram, histImage);cv::waitKey(0);return 0;} 运行结果 三、直方图均衡化 直方图均衡化是一种用于增强图像对比度的图像处理技术它通过重新分配图像的像素值使得整个亮度范围得到充分利用从而使图像看起来更清晰和具有更好的对比度 1、直方图均衡化的原理 计算直方图首先计算原始图像的灰度直方图这个直方图描述了图像中各个灰度级别的分布情况计算累积分布函数(CDF)将灰度直方图转换为累积分布函数CDF表示了每个灰度级别的累积概率映射新的像素值对于每个像素将其原始灰度值映射到新的值使得新的值在整个亮度范围内均匀分布 2、opencv中可以使用 cv::equalizeHist()函数来实现直方图均衡化 1cv::equalizeHist()函数原型 void cv::equalizeHist(InputArray src, OutputArray dst );参数解释 src输入图像(灰度图像) dst输出图像用于存储均衡化后的结果 2代码示例 灰度直方图均衡化 #include opencv2\opencv.hpp #include iostreamusing namespace cv; using namespace std;int main() {// 读取灰度图像cv::Mat image cv::imread(C:\\cpp\\image\\suzy2.jpg, cv::IMREAD_GRAYSCALE);if (image.empty()) {std::cerr Error: 无法读取图像文件. std::endl;return -1;}// 均衡化灰度直方图cv::Mat equalizedImage;cv::equalizeHist(image, equalizedImage);cv::imshow(Original Gray Image, grayImage);cv::imshow(Equalized Gray Image, equalizedImage);cv::waitKey(0);return 0;} 运行结果 彩色直方图均衡化 首先将彩色图像转换为HSV色彩空间然后对亮度(Value/V通道)进行均衡化最后将其转换回BGR色彩空间以显示 #include opencv2\opencv.hpp #include iostreamusing namespace cv; using namespace std;int main() {// 读取彩色图像cv::Mat image cv::imread(C:\\cpp\\image\\suzy2.jpg, cv::IMREAD_COLOR);if (image.empty()) {std::cerr Error: 无法读取图像文件. std::endl;return -1;}// 将图像从BGR色彩空间转换为HSV色彩空间cv::Mat hsvImage;cv::cvtColor(image, hsvImage, cv::COLOR_BGR2HSV);// 均衡化HSV通道的直方图std::vectorcv::Mat channels;cv::split(hsvImage, channels);cv::equalizeHist(channels[2], channels[2]);cv::Mat equalizedHSV;cv::merge(channels, equalizedHSV);cv::cvtColor(equalizedHSV, equalizedHSV, cv::COLOR_HSV2BGR);cv::imshow(Original Color Image, image);cv::imshow(Equalized Color Image, equalizedHSV);cv::waitKey(0);return 0;} 运行结果
http://www.w-s-a.com/news/881911/

相关文章:

  • 龙口市规划建设局网站vi设计和品牌设计的区别
  • 企业网站的总体设计网站建设评审验收会议主持词
  • 网站建设完成推广响应式网站设计开发
  • 电商网站用php做的吗网站开发流程可规划为那三个阶段
  • flash网站怎么做音乐停止深圳网站建设金瓷网络
  • 哪个网站可以做房产信息群发怎么做国内网站吗
  • 微商城网站建设公司的价格卖磁铁的网站怎么做的
  • 免费做做网站手机平台软件开发
  • 网站单页做301徐州百度网站快速优化
  • 织梦怎么制作手机网站漳州专业网站建设公司
  • 邓州做网站网络优化概念
  • 查看网站开发phonegap wordpress
  • 网站建设和维护待遇怎样c 做的网站又哪些
  • 淮南网站推广网站开发行业前景
  • 丽水市龙泉市网站建设公司江门手机模板建站
  • 做化妆品注册和注册的网站有哪些wordpress加关键字
  • 四川新站优化php笑话网站源码
  • 外贸类网站酷玛网站建设
  • 合肥网站设计建设南宁网站seo推广优化公司
  • 临沂百度网站7x7x7x7x8黄全场免费
  • 海洋牧场网站建设大良网站设计价格
  • 手机端网站关键字排名北京seo公司哪家好
  • 福建建设培训中心网站网站建站服务公司地址
  • 青岛网站优化快速排名企业网址怎么整
  • 做公司网站用什么系统seo搜索排名优化方法
  • dw怎么做网站标题图标做网站重庆
  • 机场建设相关网站公司官网设计制作
  • 大学网站建设的目标技术支持 优府网络太原网站建设
  • wordpress设置密码访问带提示广州做网站优化哪家专业
  • 如何帮人做网站赚钱西安室内设计公司排名