利用查找表修改图像外观 - 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);
}

在多通道图像上应用一维查找表时,同一个查找表会独立地应用在所有通道上。如果查找表超过一个维度,那么它和所用图像的通道数必须相同。

⚠️ **GitHub.com Fallback** ⚠️