灰度图像直方图变换的一些代码
2016-03-20 13:43
260 查看
经常,我们要对灰度图像做一些灰度变换。比如增强对比度一类的。openCV 没有直接提供函数来处理。需要我们写一点代码。这里就贴几个我经常用到的代码片段。
今天的代码中用到了些以前写的代码的功能。具体的可以参考:
http://blog.csdn.net/liyuanbhu/article/details/50708912
首先是直方图正规化。所谓直方图正规化,就是将图像中最暗的地方的亮度设为 0, 最亮的地方的亮度设为 255,其他的地方的亮度线性映射。
然后是图像增强的一种常见方法。灰度值拉伸。简单的说就是舍弃亮度直方图中最亮和最暗的一小部分,将其余的部分拉伸到 0 到 255。
下面是代码:
代码都非常简答,就不多解释了。
今天的代码中用到了些以前写的代码的功能。具体的可以参考:
http://blog.csdn.net/liyuanbhu/article/details/50708912
首先是直方图正规化。所谓直方图正规化,就是将图像中最暗的地方的亮度设为 0, 最亮的地方的亮度设为 255,其他的地方的亮度线性映射。
cv::Mat Histogram1D::normalize(const cv::Mat &image) { // Compute histogram first cv::MatND hist = getHistogram(image); int imin, imax; for(imin = 0; imin < histSize[0]; imin++) { if(hist.at<float>(imin) > 0) break; } for(imax = histSize[0] - 1; imax >= 0; imax--) { if(hist.at<float>(imax) > 0) break; } cv::Mat lookup(1, 256, CV_8U); for(int i = 0; i < 256; i++) { if(i < imin) lookup.at<uchar>(i) = 0; else if(i > imax) lookup.at<uchar>(i) = 255; else { int v = 255 * (i - imin) / (imax - imin); lookup.at<uchar>(i) = static_cast<uchar>(v); } } cv::Mat ret; cv::LUT(image, lookup, ret); return ret; }
然后是图像增强的一种常见方法。灰度值拉伸。简单的说就是舍弃亮度直方图中最亮和最暗的一小部分,将其余的部分拉伸到 0 到 255。
下面是代码:
cv::Mat Histogram1D::stretch(const cv::Mat &image, double percent1, double percent2) { cv::MatND hist = getHistogram(image); int imin, imax; if(percent1 < 0.0) percent1 = 0.0; if(percent1 > 1.0) percent1 = 1.0; percent1 = image.rows * image.cols * percent1; double value = 0; for(imin = 0; imin < histSize[0]; imin++) { value += hist.at<float>(imin); if(value > percent1) break; } value = 0; if(percent2 < 0.0) percent2 = 0.0; if(percent2 > 1.0) percent2 = 1.0; percent2 = image.rows * image.cols * percent2; for(imax = histSize[0] - 1; imax >= 0; imax--) { value += hist.at<float>(imax); if(value > percent2) break; } //int dim = 256; cv::Mat lookup(1, 256, CV_8U); for(int i = 0; i < 256; i++) { if(i < imin) lookup.at<uchar>(i) = 0; else if(i > imax) lookup.at<uchar>(i) = 255; else { int v = 255 * (i - imin) / (imax - imin); lookup.at<uchar>(i) = static_cast<uchar>(v); } } cv::Mat ret; cv::LUT(image, lookup, ret); return ret; } cv::Mat Histogram1D::stretch(const cv::Mat &image, double percent) { return stretch(image, percent, percent); }
代码都非常简答,就不多解释了。
相关文章推荐
- 灰度图像直方图变换的一些代码
- Spring框架基础示例
- 5-19 支票面额 (15分)C语言
- java第八节-多态,抽象类,接口
- Java基础之二:Java语法基础
- Qt4.8.5+VS2010+Addin配置
- RMI介绍与使用
- 使用可靠的I2C代码
- Python进阶01 文件处理
- 贪心算法—移动办公室桌子,占用走廊问题(1000,problem A)
- FTP基础知识
- JAVA CAS单点登录之一:搭建CAS服务器
- 优化php程序,试试这几招。
- 【GOF23设计模式】--单例模式
- As a good Java programer
- ASP.NET5 REST API使用示例——基于云平台+云服务打造自己的在线翻译工具
- Java Executor并发框架(三)ThreadPoolExecutor 队列缓存策略
- Java调用ASP.NET的webservice故障排除
- Eclipse juno 中安装 JBoss Tools,集成Hibernate
- Python 基础 登陆小程序