您的位置:首页 > 运维架构

opencv学习笔记-直方图和均衡化

2015-11-23 00:00 337 查看

#include <opencv2\opencv.hpp>//灰度直方图

using namespace cv;
using namespace std;

int main()
{
Mat srcImage = imread("1.jpg", 0);
MatND Hist; //用于存储直方图
float hranges[] = { 0, 255 };//统计的范围
const float* ranges[] = { hranges };
int channels = 0;//用于统计的通道
int size = 256;
if (!srcImage.data)
cout << "Error!" << endl;
cout << srcImage.channels() << endl;
calcHist(&srcImage, 1, &channels, Mat(), Hist, 1, &size, ranges);//计算直方图
Mat dstImage (size, size, CV_8U, Scalar(0));

double maxValue;
minMaxLoc(Hist, 0, &maxValue, 0, 0);
cout << maxValue;

for (int i = 0; i < 256; i++)
{
float Value = Hist.at<float>(i);
int binValue = Value*size / maxValue;
rectangle(dstImage, Point(i, size - 1), Point(i, size - binValue), Scalar(255));
}

imshow("1", dstImage);

waitKey();
return 0;
}<pre class="cpp" name="code">#include <opencv2\opencv.hpp>//直方图均衡化

using namespace cv;
using namespace std;

int main()
{
Mat srcImage;
Mat dstImage;
srcImage = imread("1.jpg");
if (!srcImage.data)
{
cout << "Error!" << endl;
return -1;
}

cvtColor(srcImage, srcImage, COLOR_BGR2GRAY);
imshow("first", srcImage);

equalizeHist(srcImage, dstImage);
imshow("finally", dstImage);

waitKey();
return 0;
}




openc学习笔记-直方图相关

记录一些学习数字图像处理的笔记,参考了<<opencv3编程入门>>,<<数字图像处理的matlab实现>>2本书,理论数学部分用matlab学习,但大部分内容还是会写代码,matlab对于理解图像处理的数学内容还是很有用的。

数字直方图画出了每个亮度的像素数,亮度可以是1-255(对于uint8图像来说),也就可以是(0-20)(21-41)...这取决与你怎样分割亮度范围。下面用matlab画出了一幅灰度图像的直方图

可以看到该图像的像素主要集中在亮度100内,整体看上去就会暗一点。下面是原图

。最上面是用opencv写的代码,对灰度图像画出了直方图

:opencv画直方图只需要用calcHist()函数和rectangle()函数就行。读者自行找帮助文档,这里就不说了。

对于直方图均衡化,可以使灰度图像的动态范围变大,对比度加强,下面用matlab给出了第一个直方图均衡化后的效果可以看到

,图像对比度加强,视觉上看的更加清晰。下面是均衡化后的直方图分布。

可以看到各个灰度值的像素分布更加广,对比度加强。上面贴出了opencv一个简单的均衡化代码,主要来自于《opencv3编程入门》一书。当然对于有些图像,均衡化并不一定能够改善对比度,如果一幅图像直方图在0级亮度区域像素过于集中,那么均衡化后像素会在亮区域集中,并不能达到效果。这时候就需要给直方图规定一个形状,称之为直方图的规定化,在opencv中我还没实现,不过matlab可以很简单实现,有兴趣的可以找找冈萨雷斯图像处理的M函数源码,自己试试。关于直方图相关的数(蛋)学(疼)知识就不解释了,书和网上都有很多。第一次写博客,有写的不对地方谢谢指正。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息