300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【数字图像处理】灰度变换函数(对数变换 反对数变换 幂次变换)

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

时间:2024-03-05 21:40:05

相关推荐

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

// 对比度增强.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) / vvalue.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 ^ vr为输入图像像素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;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。