#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
cv::Mat logTransform1(cv::Mat srcImage, int c) {
if (srcImage.empty())
std::cout << "No data!" << std::endl;
cv::Mat resultImage = cv::Mat::zeros(srcImage.size(), srcImage.type());
cv::add(srcImage, cv::Scalar(1.0), srcImage);
srcImage.convertTo(srcImage, CV_32F);
log(srcImage, resultImage);
resultImage = c * resultImage;
cv::normalize(resultImage, resultImage, 0, 255, cv::NORM_MINMAX);
cv::convertScaleAbs(resultImage, resultImage);
return resultImage;
}
cv::Mat logTransform2(Mat srcImage, float c) {
if (srcImage.empty())
std::cout << "No data!" << std::endl;
cv::Mat resultImage = cv::Mat::zeros(srcImage.size(), srcImage.type());
double gray = 0;
for (int i = 0; i < srcImage.rows; i++) {
for (int j = 0; j < srcImage.cols; j++) {
gray = (double)srcImage.at<uchar>(i, j);
gray = c * log((double)(1 + gray));
resultImage.at<uchar>(i, j) = saturate_cast<uchar>(gray);
}
}
cv::normalize(resultImage, resultImage, 0, 255, cv::NORM_MINMAX);
cv::convertScaleAbs(resultImage, resultImage);
return resultImage;
}
cv::Mat logTransform3(Mat srcImage, float c) {
if (srcImage.empty())
std::cout << "No data!" << std::endl;
cv::Mat resultImage = cv::Mat::zeros(srcImage.size(), srcImage.type());
srcImage.convertTo(resultImage, CV_32F);
resultImage = resultImage + 1;
cv::log(resultImage, resultImage);
resultImage = c * resultImage;
cv::normalize(resultImage, resultImage, 0, 255, cv::NORM_MINMAX);
cv::convertScaleAbs(resultImage, resultImage);
return resultImage;
}
int main() {
cv::Mat srcImage = cv::imread("lena.jpg", 0);
if (!srcImage.data)
return -1;
cv::imshow("srcImage", srcImage);
float c = 1.1;
cv::Mat resultImage;
resultImage = logTransform1(srcImage, c);
cv::imshow("resultImage1", resultImage);
resultImage = logTransform2(srcImage, c);
cv::imshow("resultImage2", resultImage);
resultImage = logTransform3(srcImage, c);
cv::imshow("resultImage3", resultImage);
cv::waitKey(0);
return 0;
}