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

来源:互联网 发布:c比java难多少 编辑:程序博客网 时间:2024/04/29 10:04

#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函数源码,自己试试。关于直方图相关的数(蛋)学(疼)知识就不解释了,书和网上都有很多。第一次写博客,有写的不对地方谢谢指正。

 


0 0
原创粉丝点击