【数字图像处理】灰度变换函数(对数变换、反对数变换、幂次变换)
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; }
相关文章推荐
- 数字图像处理-空间域处理-灰度变换-基本灰度变换函数(反转变换、对数变换、伽马变换和分段线性变换)
- 数字图像处理-空间域图像增强(一)(图像反转,对数变换,幂次变换、分段线性变换)
- [数字图像处理]灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割
- [数字图像处理]灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割
- 数字图像处理 -灰度变换 之 对数变换(Log Transformation)
- [数字图像处理]灰度变换——反转,对数变换,伽马变换,灰度拉伸,灰度切割,位图切割
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
- [数字图像处理]简单的几何学图像变换与图像配准
- 数字图像处理:第十一章基于特征向量的变换
- 数字图像处理——灰度变换与空间滤波(使用MFC)
- 数字图像处理--空间变换
- 数字图像处理:各种变换滤波和噪声的类型和用途总结
- [Other]数字图像处理:各种变换滤波和噪声的类型和用途总结
- 数字图像处理--空间变换
- 数字图像处理——用Java对图像做镜像变换
- 系统学习数字图像处理之灰度变换和空域滤波
- 数字图像处理之亮度变换
- 数字图像处理--空间变换
- 数字图像处理之灰度变换
- 数字图像处理--空间变换