今天写直方图,学了几个相关函数

1. mixChannels

void mixChannels(const Mat* src, int nsrc, Mat* dst, int ndst, const int* fromTo, size_t npairs)

功能: 把 src 中指定的若干通道 复制到 dst中

src: 输入图像, 可以多张

nsrc: 有多少张输入图像

dst: 输出图像,可以多张

ndst: 有多少张输出图像

fromTo: {0 , 1, 1, 2, 2, 0} 这样偶数个数的数组, 表示把输入图像的第0通道复制到输出图像的第1通道, 把输入图像的第1通道复制到输出图像的第2通道, 把输入图像的第2通道复制到输出图像的第0通道。

nparis:表示有fromTo中有多少对, 对{0 , 1, 1, 2, 2, 0}来说,nparis = 3;

应用例子: 来源http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/core/doc/operations_on_arrays.html?highlight=mixchannels#void mixChannels(const Mat* src, int nsrc, Mat* dst, int ndst, const int* fromTo, size_t npairs)

In the example below, the code splits a 4-channel RGBA image into a 3-channel BGR (with R and B channels swapped) and a separate alpha-channel image:

Mat rgba( , , CV_8UC4, Scalar(,,,) );
Mat bgr( rgba.rows, rgba.cols, CV_8UC3 );
Mat alpha( rgba.rows, rgba.cols, CV_8UC1 ); // forming an array of matrices is a quite efficient operation,
// because the matrix data is not copied, only the headers
Mat out[] = { bgr, alpha };
// rgba[0] -> bgr[2], rgba[1] -> bgr[1],
// rgba[2] -> bgr[0], rgba[3] -> alpha[0]
int from_to[] = { ,, ,, ,, , };
mixChannels( &rgba, , out, , from_to, );

2. cvRound

int cvRound(double value)

功能:返回与value最接近的整数

3. createTrackbar

int cvCreateTrackbar(const char* trackbarName, const char* windowName, int* value, int count, CvTrackbarCallback onChange)

功能:创建一个滑动条。

trackbarName: 滑动条名字

windowname: 滑动条父窗口的名字,滑动条会显示在父窗口上

value: 滑动条的默认初始值

count: 滑动条在最大位置时对应的数值, 最小值总是0

onChange: 滑动条的回调函数, 都是 void Foo(int, void*); 的形式, 其第一个参数是滑动条对应的数值, 第二个参数是传递用户信息的,可以避免使用全局变量

4. calcHist

void calcHist(const Mat* arrays, int narrays, const int* channels, InputArray mask, OutputArrayhist, int dims, const int* histSize, const float** ranges, bool uniform=true, bool accumulate=false )

功能:计算直方图

arrays: 输入的图像,可以不只一张

narrays: 输入图像的个数

channels: 输入图像中用来统计直方图的通道 如果有三张三通道图,则第一张图的三个通道分别是 0, 1, 2, 第二张图的三个通道分别是3, 4, 5, 第三张图的三个通道分别是 6, 7, 8.

mask: 若非空, 则只有mask中不为0的部分会被用来统计直方图

hist: 输出直方图

dims: 输出直方图的维数, 最大不能超过32

histSize: 每个维度下直方图被分为多少个区间

ranges: 每个区间的范围, 如果uniform = true 则每个区间会在给定的范围内均匀的选取。 如ranges = {0, 180}, histSize = 4, uniform = true, 则每个区间的范围是[0, 45] [45, 90][90, 135][135, 180];  如果uniform = false 则每个区间的范围都要给出如: ranges = {0, 20, 60, 120, 180}, 区间范围是[0, 20][20, 60][60, 120][120, 180]

uniform: 区间是否均匀

accumulate: 如果是true,hist在使用中不会被清零,可以使多个图的直方图叠加在一起。

下面的例子用到了上面的函数,用来计算一幅图的直方图和反向投影图。

来源:http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/histograms/back_projection/back_projection.html?highlight=histogram

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp" #include <iostream> using namespace cv;
using namespace std; Mat hsv; Mat hue;
int bins = ; void Hist_and_Backproj(int, void*); int main()
{
IplImage *pimg = cvLoadImage("E:\\picture\\013.jpg");
Mat src(pimg);
//src = imread("F:\\competition\\label_results\\dongnanmen_1_1280x720_30_R1_0000001.jpg", 1);
//imshow("test", src);
cvtColor(src, hsv, CV_BGR2HSV); //分离Hue通道
hue.create(hsv.size(), hsv.depth());
int ch[] = {, };
mixChannels(&hsv, , &hue, , ch, ); //创建Trackbar 来输入bin的数目
char* window_image = "Source image";
namedWindow(window_image, CV_WINDOW_AUTOSIZE);
createTrackbar("* Hue bins: ", window_image, &bins, , Hist_and_Backproj);
Hist_and_Backproj(, ); imshow(window_image, src); waitKey();
return ;
} //Trackbar事件的回调函数
void Hist_and_Backproj(int, void*)
{
MatND hist;
int histSize = MAX(bins, );
float hue_range[] = {, };
const float* ranges = {hue_range}; //计算直方图并归一化
calcHist(&hue, , , Mat(), hist, , &histSize, &ranges, true, false);
normalize(hist, hist, , , NORM_MINMAX, -, Mat()); //计算反向投影
MatND backproj;
calcBackProject(&hue, , , hist, backproj, &ranges, , true); //显示反向投影图
imshow("BackProj", backproj); //显示直方图
int w = ; int h = ;
int bin_w = cvRound((double)w / histSize);
Mat histImg = Mat::zeros(w, h, CV_8UC3); for(int i = ; i < bins; i++)
{
rectangle(histImg, Point(i * bin_w, h), Point((i + ) * bin_w, h - cvRound(hist.at<float>(i) * h / 255.0)), Scalar(, , ), -);
}
imshow("Histogram", histImg);
}

【OpenCV】直方图的更多相关文章

  1. openCV 直方图统计

    直方图显示 #include <opencv2/opencv.hpp> using namespace std; using namespace cv; int main(int argc ...

  2. OPENCV直方图与匹配

    直方图可以用来描述不同的参数和事物,如物体的色彩分布,物体的边缘梯度模版以及目标位置的当前假设的概率分布. 直方图就是对数据进行统计的一种方法,并且将统计值定义到一系列定义好的bin(组距)中,获得一 ...

  3. OpenCV——直方图均衡化(用于图像增强)

    #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespac ...

  4. opencv:直方图操作

    示例程序: #include <opencv.hpp> using namespace cv; using namespace std; int main() { Mat src, dst ...

  5. opencv直方图该怎么画

    图像直方图是反映图像中像素分布特性的统计表,一般显示如下: 其中横坐标代表的是图像像素的种类,或者说是灰度级,纵坐标代表的是每一级灰度下像素数或者该灰度级下像素数在所有图像总像素数总所占的百分比. 直 ...

  6. OpenCV直方图(直方图、直方图均衡,直方图匹配,原理、实现)

    1 直方图 灰度级范围为 \([0,L-1]\) 的数字图像的直方图是离散函数 \(h(r_k) = n_k\) , 其中 \(r_k\) 是第\(k\)级灰度值,\(n_k\) 是图像中灰度为 \( ...

  7. opencv 直方图

    1.简介 对输入图像进行直方图均衡化处理,提升后续对象检测的准确率在OpenCV人脸检测的代码演示中已经很常见.此外对医学影像图像与卫星遥感图像也经常通过直方图均衡化来提升图像质量. 图像直方图均衡化 ...

  8. opencv直方图均衡化

    #include <iostream> #include "highgui.h" #include "cv.h" #include "cx ...

  9. opencv直方图拉伸

    1.首先计算出一幅图像的直方图 //计算直方图 cv::MatND ImageHist::getHist(const cv::Mat &image){ cv::Mat im; if(image ...

  10. Opencv 直方图比较

    #include <iostream>#include <opencv2/opencv.hpp> using namespace std;using namespace cv; ...

随机推荐

  1. JLS(Third Edition) Chapter12 Execution

    这一章详细说明在一个program执行时,发生的activities. 它根据JVM和组成program的类.接口.实例的生命周期 组织.   一个JVM从加载一个特定的类并调用它的main方法开始启 ...

  2. nyoj 252 01串 动态规划( java)

    当n=2时, 输出 3:当n=3时, 输出 5:当n=4时, 输出 8: #### 分析: 当n=4时,如 0101 符合条件, 当第一个位置是0时,还剩3个位置 ,与n=3时个数相等: 符合条件的为 ...

  3. WCF :IIS寄宿方式的Web地址、BaseAddress和EndPoint Address的关系

    对于在IIS中通过W3SVC或WAS寄宿的WCF Service,其在浏览器中显示的地址(Web地址),与其配置文件中的BaseAddress和EndPoint Address有什么关系呢?让我们来分 ...

  4. STM32F10xx CAN BUS相关库文件"stm32f10x_can.c"内的库函数解析

    一.背景: 还是继续CAN通信,要节省开发时间,使用库函数可大大降低开发周期,并且还能确保寄存器的配置几 乎是万无一失,所以,在此就STM32F10xx的CAN操作库函数的使用做个简析. STM32有 ...

  5. Java Annotation自定义注解详解

    在开发过程中总能用到注解,但是从来没有自己定义过注解.最近赋闲在家,研究整理了一番,力求知其然知其所以然. 本文会尝试描述什么是注解,以及通过一个Demo来说明如何在程序中自定义注解.Demo没有实际 ...

  6. 安装JBPM6运行环境(JBPM6学习之二)

    安装Eclipse插件成功后,需要配置JBPM6的运行环境: 1. 第一步先将下载的jbpm6目录中的“jbpm-6.0.1.Final-bin.zip”找到,并解压缩到D盘根目录备用. 2. 第二步 ...

  7. JavaScript中的跨域

    跨域是什么 跨域就是指从一个域名的网页去请求另一个域名的资源,因为JavaScript同源策略的限制,资源无法获取.比如从www.baidu.com 页面去请求 www.google.com 的资源, ...

  8. sql执行顺序

    SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...

  9. Sqli-LABS通关笔录-18-审计SQL注入2-HTTP头注入

     在此关卡我学习到了 1.只要跟数据库交互的多观察几遍.特别是对于http头这种类型的注入方式. 2. <?php //including the Mysql connect parameter ...

  10. Open CV缩放图像

    缩放图像是图像处理中需要经常使用的操作.太小的图像在图像识别中不能很好的处理,需要将其放大,太大的图像不方便储存,需要将其缩小,下面记录OpenCV图片缩放方法. 缩放函数 , , int inter ...