使用 OpenCV 对图像进行 Gamma 校正

图像可能看起来太亮或太暗,伽马校正是一种允许控制图像亮度的方法。用于获得伽玛校正图像的公式如下:

Gama校正公式
  • I– 输入像素值 [0, 255]。
  • O– 输出像素值 [0, 255]。
  • γ– 控制图像亮度的伽玛。如果 gamma < 1 那么图像会更暗,如果 gamma > 1 那么图像会更亮。gamma = 1 无效。

图像像素值从范围 [0, 255] 转换为 [0, 1.0]。计算后,值将转换回范围 [0, 255]。

可以使用查找表 (LUT) 实现伽马校正。它将输入像素值映射到输出值。对于范围 [0, 255] 中的每个像素值,计算相应的伽玛校正值。OpenCV 提供了LUT执行查找表转换的功能。

package app;

import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;

public class Main
{
    static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }

    public static void gammaCorrection(Mat src, Mat dst, float gamma)
    {
        float invGamma = 1 / gamma;

        Mat table = new Mat(1, 256, CvType.CV_8U);
        for (int i = 0; i < 256; ++i) {
            table.put(0, i, (int) (Math.pow(i / 255.0f, invGamma) * 255));
        }

        Core.LUT(src, table, dst);
    }

    public static void main(String[] args)
    {
        Mat img = Imgcodecs.imread("test.jpg");
        Mat gammaImg = new Mat();
        gammaCorrection(img, gammaImg, 2.2f);

        HighGui.imshow("Original image", img);
        HighGui.imshow("Gamma corrected image", gammaImg);
        HighGui.waitKey(0);
        HighGui.destroyAllWindows();

        System.exit(0);
    }
}
import cv2
import numpy as np


def gammaCorrection(src, gamma):
    invGamma = 1 / gamma

    table = [((i / 255) ** invGamma) * 255 for i in range(256)]
    table = np.array(table, np.uint8)

    return cv2.LUT(src, table)


img = cv2.imread('test.jpg')
gammaImg = gammaCorrection(img, 2.2)

cv2.imshow('Original image', img)
cv2.imshow('Gamma corrected image', gammaImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
#include <opencv2/opencv.hpp>

using namespace cv;

void gammaCorrection(const Mat &src, Mat &dst, const float gamma)
{
    float invGamma = 1 / gamma;

    Mat table(1, 256, CV_8U);
    uchar *p = table.ptr();
    for (int i = 0; i < 256; ++i) {
        p[i] = (uchar) (pow(i / 255.0, invGamma) * 255);
    }

    LUT(src, table, dst);
}

int main()
{
    Mat img = imread("test.jpg");
    Mat gammaImg;
    gammaCorrection(img, gammaImg, 2.2);

    imshow("Original image", img);
    imshow("Gamma corrected image", gammaImg);
    waitKey(0);
    destroyAllWindows();

    return 0;
}

效果图:

使用 OpenCV 对图像进行 Gamma 校正

版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。

(0)

相关推荐

发表回复

登录后才能评论