【数字图像处理】灰度变换函数(对数变换、反对数变换、幂次变换)

// 对比度增强.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <math.h>
#include <iostream>

using namespace cv;
using namespace std;

//归一化
//data				进行处理的像素集合
//grayscale			目标灰度级
//rows cols type	目标图像的行,列,以及类型
Mat Normalize(vector<double> data, int grayscale, int rows, int cols, int type)
{
	double max = 0.0;
	double min = 0.0;
	for(int i = 0;i < data.size();i++)
	{
		if(data[i] > max)
			max = data[i];
		if(data[i] < min)
			min = data[i];
	}
	Mat dst;
	dst.create(rows, cols, type);
	int index = 0;
	for(int r = 0;r < dst.rows;r++)
	{
		uchar* dstRowData = dst.ptr<uchar>(r);
		for(int c = 0;c < dst.cols;c++)
		{
			dstRowData[c] = (uchar)(grayscale * ((data[index++] - min) * 1.0 / (max - min)));
		}
	}
	return dst;
}

//对数变换
Mat LogTransform(Mat src, double parameter)
{
	vector<double> value;
	for(int r = 0;r < src.rows;r++)
	{
		uchar* rowData = src.ptr<uchar>(r);
		for(int c = 0;c < src.cols;c++)
		{
			//对数变换公式s = c * log(1 + v * r) / log(v + 1)
			//其中r为输入图像像素,c为常数,v + 1为对数底
			value.push_back(log(1 + parameter * rowData[c]) / log(parameter + 1));
		}
	}
	//计算得出的s经过对比拉升(将像素值归一化到0-255)得到最终的图像
	return Normalize(value, 255, src.rows, src.cols, src.type());
}

//反对数变换
Mat NegativeLogTransform(Mat src, double parameter)
{
	vector<double> value;
	for(int r = 0;r < src.rows;r++)
	{
		uchar* srcRowData = src.ptr<uchar>(r);
		for(int c = 0;c < src.cols;c++)
		{
			//反对数变换公式为s = ((v + 1) ^ r - 1) / v
			value.push_back((pow(parameter + 1, srcRowData[c]) - 1) / parameter);
		}
	}
	//计算得出的s经过对比拉升(将像素值归一化到0-255)得到最终的图像
	return Normalize(value, 255, src.rows, src.cols, src.type());
}

//幂次变换
Mat PowerTranseform(Mat src, double gamma, int parameter)
{
	Mat dst;
	dst.create(src.size(), src.type());
	vector<double> value;
	for(int r = 0;r < src.rows;r++)
	{
		uchar* srcRowData = src.ptr<uchar>(r);
		for(int c = 0;c < src.cols;c++)
		{
			//幂次变换的公式为 s = c * r ^ v	r为输入图像像素
			value.push_back(parameter * pow((double)srcRowData[c], gamma));
		}
	}
	return Normalize(value, 255, src.rows, src.cols, src.type());
}

int _tmain(int argc, _TCHAR* argv[])
{
	Mat srcImg = imread("E:\\学习之路\\OpenCV 练习程序\\01.jpg",0);
	if(srcImg.data == NULL)
	{
		cout << "图像打开失败" << endl;
	}
	imshow("原图",srcImg);
	//Mat dstImg = LogTransform(srcImg,0.2);
	Mat dstImg;
	//dstImg = NegativeLogTransform(srcImg, 3);
	dstImg = PowerTranseform(srcImg, 0.4, 1);
	imshow("变换后",dstImg);
	waitKey(0);
	return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值