opencv4 图像增强的简单实现

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值