OpenCV-对比度增强(伽马变换)
伽马变换的实质就是对每一个像素进行幂函数操作。
C++:
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace std;
using namespace cv;
int main()
{
//原图;灰度图;对比度增强后的伽马图像
Mat img, gray_image, gamma_image;
img = imread("D:/cat.jpg");
imshow("original image",img);
cvtColor(img,gray_image,COLOR_BGR2GRAY);
imshow("gray image",gray_image);
gamma_image.create(gray_image.size(), CV_64F);
//伽马变换
Mat src,gammaimage; //归一化图像
double gamma = 1.5;
gray_image.convertTo(src, CV_64F, 1.0 / 255,0);
int height = src.rows;
int width = src.cols;
gamma_image.create(src.size(), CV_64F);
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
gamma_image.at<double>(i, j) = pow(src.at<double>(i, j), gamma);
};
};
gamma_image.convertTo(gammaimage, CV_8U, 255,0);
imshow("gamma image", gammaimage);
waitKey(0);
return 0;
};
结果:

Python:
import cv2 as cv
import numpy as np
##读取图像
img = cv.imread('D:/woman.jpg')
cv.imshow("original image",img)
##读取图像高宽和通道数
height,width,channel=img.shape
##初始化空白图像和系数
gamma_image=np.zeros(img.shape,dtype=np.float64)
#图像归一化和伽马系数
src=img/255.0
gamma=0.5
for r in range(height):
for c in range(width):
B = src[r, c][0]
G = src[r, c][1]
R = src[r, c][2]
gamma_image[r ,c][0] = np.power(B,gamma)
gamma_image[r, c][1] = np.power(G,gamma)
gamma_image[r, c][2] = np.power(R,gamma)
cv.imshow("gamma image",gamma_image)
cv.waitKey(0)
cv.destroyAllWindows()
结果:效果比之前的线性变换要自然许多,参数之间的选择占了很大关系。
伽马变换:
线性变换:


浙公网安备 33010602011771号