main.cpp
#include<opencv2/opencv.hpp>
#include<opencv2/calib3d.hpp>
#include<iostream>
#include"imgProcess.h"
using namespace cv;
using namespace std;
int main()
{
ImageProcess imageProcesser;
VideoCapture cap(0);
Mat img;
cap >> img;
if (img.empty())
{
cout << "can not open the image";
}
imshow("img", img);
Mat equal = imageProcesser.coloredImageEqual(img);
Mat lap = imageProcesser.lapImageProcess(img);
Mat log = imageProcesser.logProcess(img,11);
Mat log_1 = imageProcesser.logProcess(img, 0.01);
Mat gama = imageProcesser.expProcess(img, 2, 0.4);
imageProcesser.hist(img);
imageProcesser.hist(equal);
imshow("zengqiang", log);
imshow("zengqiang_1", log_1);
imshow("exp", gama);
waitKey(0);
imageProcess.h
#pragma once
#include<opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
class ImageProcess
{
public:
ImageProcess();
~ImageProcess();
void inputImage(Mat image);
Mat hist(Mat image);
Mat getImage();
Mat coloredImageEqual(Mat image);
Mat lapImageProcess(Mat image);
Mat logProcess(Mat image, double c);
Mat expProcess(Mat image, double c,double gama);
private:
Mat img;
};
imageProcess.cpp
#include"imgProcess.h"
ImageProcess::ImageProcess()
{
img = Mat();
}
ImageProcess::~ImageProcess()
{
}
void ImageProcess::inputImage(Mat image)
{
img = image;
}
Mat ImageProcess::getImage()
{
return img;
}
Mat ImageProcess::coloredImageEqual(Mat image)
{
Mat imageRGB[3];
Mat result;
split(image, imageRGB);
for (auto x: imageRGB)
{
equalizeHist(x, x);
}
merge(imageRGB,3, result);
return result;
}
Mat ImageProcess::lapImageProcess(Mat image)
{
Mat imageEnhance;
Mat kernal = (Mat_<float>(3, 3) << 0, -1, 0, 0, 5, 0, 0, -1, 0);
filter2D(image, imageEnhance, CV_8UC3, kernal);
return imageEnhance;
}
Mat ImageProcess::logProcess(Mat image,double c)
{
Mat logImage(image.size(), CV_32FC3);
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
logImage.at<Vec3f>(i, j)[0] = c * log(1 + image.at<Vec3b>(i, j)[0]);
logImage.at<Vec3f>(i, j)[1] = c * log(1 + image.at<Vec3b>(i, j)[1]);
logImage.at<Vec3f>(i, j)[2] = c * log(1 + image.at<Vec3b>(i, j)[2]);
}
}
normalize(logImage, logImage, 0, 255, NORM_MINMAX);
convertScaleAbs(logImage, logImage);
return logImage;
}
Mat ImageProcess::expProcess(Mat image, double c,double gama)
{
Mat expImage = Mat(image.size(), CV_32FC3);
for (int i = 0; i < image.rows; i++)
{
for (int j = 0; j < image.cols; j++)
{
expImage.at<Vec3f>(i, j)[0] = c * pow(image.at<Vec3b>(i, j)[0], gama);
expImage.at<Vec3f>(i, j)[1] = c * pow(image.at<Vec3b>(i, j)[1], gama);
expImage.at<Vec3f>(i, j)[2] = c * pow(image.at<Vec3b>(i, j)[2], gama);
}
}
normalize(expImage, expImage, 0, 255, NORM_MINMAX);
convertScaleAbs(expImage, expImage);
//imshow("img", expImage);
//waitKey(0);
return expImage;
}
Mat ImageProcess::hist(Mat image)
{
vector<Mat>bgr_planes;
split(image, bgr_planes);
//split(// 把多通道图像分为多个单通道图像 const Mat &src, //输入图像 Mat* mvbegin)// 输出的通道图像数组
//步骤二:计算直方图
int histsize = 256;
float range[] = { 0,256 };
const float* histRanges = { range };
Mat b_hist, g_hist, r_hist;
calcHist(&bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histsize, &histRanges, true, false);
calcHist(&bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histsize, &histRanges, true, false);
calcHist(&bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histsize, &histRanges, true, false);
//归一化
int hist_h = 400;//直方图的图像的高
int hist_w = 512;直方图的图像的宽
int bin_w = hist_w / histsize;//直方图的等级
Mat histImage(hist_w, hist_h, CV_8UC3, Scalar(0, 0, 0));//绘制直方图显示的图像
normalize(b_hist, b_hist, 0, hist_h, NORM_MINMAX, -1, Mat());//归一化
normalize(g_hist, g_hist, 0, hist_h, NORM_MINMAX, -1, Mat());
normalize(r_hist, r_hist, 0, hist_h, NORM_MINMAX, -1, Mat());
//步骤三:绘制直方图(render histogram chart)
for (int i = 1; i < histsize; i++)
{
//绘制蓝色分量直方图
line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(b_hist.at<float>(i - 1))),
Point((i)*bin_w, hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, LINE_AA);
//绘制绿色分量直方图
line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(g_hist.at<float>(i - 1))),
Point((i)*bin_w, hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, LINE_AA);
//绘制红色分量直方图
line(histImage, Point((i - 1) * bin_w, hist_h - cvRound(r_hist.at<float>(i - 1))),
Point((i)*bin_w, hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, LINE_AA);
}
return histImage;
}
参考
http://blog.csdn.net/dcrmg/article/details/53677739
https://blog.csdn.net/zhu_hongji/article/details/81663161