您的位置:首页 > 其它

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

2017-09-07 15:46 525 查看
// 对比度增强.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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: