opencv学习笔记-直方图和均衡化
2015-11-23 00:00
337 查看
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函数源码,自己试试。关于直方图相关的数(蛋)学(疼)知识就不解释了,书和网上都有很多。第一次写博客,有写的不对地方谢谢指正。
#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函数源码,自己试试。关于直方图相关的数(蛋)学(疼)知识就不解释了,书和网上都有很多。第一次写博客,有写的不对地方谢谢指正。
相关文章推荐
- PHP GD 图像处理组件的常用函数总结
- PHP图像处理之imagecreate、imagedestroy函数介绍
- 解析在main函数之前调用函数以及对设计的作用详解
- jsvascript图像处理―(计算机视觉应用)图像金字塔
- Javascript图像处理思路及实现代码
- javascript图片相似度算法实现 js实现直方图和向量算法
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- java和matlab画多边形闭合折线图示例讲解
- 使用opencv拉伸图像扩大分辨率示例
- PHP图像处理之使用imagecolorallocate()函数设置颜色例子
- java数字图像处理基础使用imageio写图像文件示例
- C#调用Matlab生成的dll方法的详细说明
- 使用Java进行图像处理的一些基础操作
- javascript图像处理―边缘梯度计算函数
- Javascript图像处理―阈值函数实例应用
- Javascript图像处理―虚拟边缘介绍及使用方法
- OpenCV 2.4.3 C++ 平滑处理分析
- PHP图像处理类库及演示分享
- php图像处理函数大全(推荐收藏)