利用查找表修改图像外观 - sumpig/OpenCV GitHub Wiki
本节将解释如何用一个简单的映射函数(称为查找表)来修改图像的像素值。
cv::Mat applyLookUp(const cv::Mat& image, // 输入图像
const cv::Mat& lookup) {// uchar 类型的1×256 数组
// 输出图像
cv::Mat result;
// 应用查找表
cv::LUT(image,lookup,result);
return result;
}
// 创建一个图像反转的查找表
cv::Mat lut(1,256,CV_8U); // 256×1 矩阵
for (int i=0; i<256; i++) {
// 0 变成255、1 变成254,以此类推
lut.at<uchar>(i)= 255-i;
}
cv::Mat result = h.applyLookUp(image, lut);
cv::Mat stretch(const cv::Mat &image, float percentile) {
// 像素的百分比
float number= image.total()*percentile;
cv::Mat hist = getHistogram(image);
// 找到直方图的左极限
int imin = 0;
for (float count=0.0; imin < 256; imin++) {
if ((count+=hist.at<float>(imin)) >= number)
break;
}
int imax = 255;
for (float count=0.0; imax >= 0; imax--) {
if ((count += hist.at<float>(imax)) >= number)
break;
}
int dims[1] = { 256 };
cv::Mat lookup(1, dims, 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 lookup.at<uchar>(i) = cvRound(255.0*(i - imin) / (imax - imin));
}
cv::Mat result;
result = applyLookUp(image, lookup);
return result;
}
// 对比度伸展 1%
cv::Mat str = h.stretch(image, 0.01f);
void colorReduce(cv::Mat &image, int div=64) {
cv::Mat lookup(1, 256, CV_8U);
// 定义减色查找表的值
for (int i=0; i<256; i++)
lookup.at<uchar>(i) = i/div*div + div/2;
// 对每个通道应用查找表
cv::LUT(image, lookup, image);
}
在多通道图像上应用一维查找表时,同一个查找表会独立地应用在所有通道上。如果查找表超过一个维度,那么它和所用图像的通道数必须相同。