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;
};

结果:
gamma=1.5gamma=0.5Python:

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()

结果:效果比之前的线性变换要自然许多,参数之间的选择占了很大关系。
伽马变换:
伽马变化:系数=0.5线性变换:
线性变换

posted @ 2020-03-21 10:42  code_witness  阅读(659)  评论(0)    收藏  举报