图像可能看起来太亮或太暗,伽马校正是一种允许控制图像亮度的方法。用于获得伽玛校正图像的公式如下:
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;
}
效果图:
版权声明:本文内容转自互联网,本文观点仅代表作者本人。本站仅提供信息存储空间服务,所有权归原作者所有。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至1393616908@qq.com 举报,一经查实,本站将立刻删除。