http://blog.youkuaiyun.com/chentravelling/article/details/45331225
opencv 从原始的图像中找出ROI区域
#include <iostream>
#include <highgui.h>
using namespace std;
using namespace cv;
int main()
{
IplImage *image = cvLoadImage("I:\\OpenCV Learning\\picture\\sumpalace.jpg");
cvShowImage("image1",image);
//将ROI区域图像保存在image中:左上角x、左上角y、矩形长、宽
cvSetImageROI(image,cvRect(200,200,600,200));
cvShowImage("imageROI",image);
//执行cvSetImageROI()之后显示image图像是只显示ROI标识的一部分,即改变了指针image,
//但是它仍旧保留有原来图像的信息,在执行这一句cvResetImageROI(image),之后,image指示原来的图像信息。
cvResetImageROI(image);
cvShowImage("image2",image);
cvWaitKey(0);
return 0;
}
http://www.cnblogs.com/ronny/p/opencv_road_4.html
不均匀直方图,我们分别统计0-50,50-80,80-150,150-230,230-255区间的灰度分布:
int main()
{
Mat Image=imread("../cat.png");
cvtColor(Image,Image,CV_BGR2GRAY);
const int channels[1]={0};
int histSize[1]={5};
float hranges[6]={0,50,80,150,230,255};
const float* ranges[1]={hranges};
MatND hist;
calcHist(&Image,1,channels,Mat(),hist,1,histSize,ranges,false);
return 0;
}
直方图的显示
从上面的例子中我们可以看出,直方图计算得到的实际上是一个多维数组,这并不够直观,我们希望能够像在Excel中把相关数据通过表的形式表示出来。
下面通过划线函数来把一个灰度直方图显示出来:
Mat getHistImg(const MatND& hist)
{
double maxVal=0;
double minVal=0;
//找到直方图中的最大值和最小值
minMaxLoc(hist,&minVal,&maxVal,0,0);
int histSize=hist.rows;
Mat histImg(histSize,histSize,CV_8U,Scalar(255));
// 设置最大峰值为图像高度的90%
int hpt=static_cast<int>(0.9*histSize);
for(int h=0;h<histSize;h++)
{
float binVal=hist.at<float>(h);
int intensity=static_cast<int>(binVal*hpt/maxVal);
line(histImg,Point(h,histSize),Point(h,histSize-intensity),Scalar::all(0));
}
return histImg;
}