灰度图像直方图变换的一些代码
Posted liyuanbhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了灰度图像直方图变换的一些代码相关的知识,希望对你有一定的参考价值。
经常,我们要对灰度图像做一些灰度变换。比如增强对比度一类的。openCV 没有直接提供函数来处理。需要我们写一点代码。这里就贴几个我经常用到的代码片段。
今天的代码中用到了些以前写的代码的功能。具体的可以参考:
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);
}
代码都非常简答,就不多解释了。
以上是关于灰度图像直方图变换的一些代码的主要内容,如果未能解决你的问题,请参考以下文章
对视频剪辑应用灰度图像变换+Moviepy生成灰度视频处理遇到几个有意思的问题