这个是之前写的函数,通过别人对灰度图像处理,我对其进行改进,对彩色图像进行处理,可实现对彩色图像处理的功能,效果良好,但是我要做视频处理,实时性达不到,基本上每帧要跑到500ms,视频卡顿,经过好久的优化,最后通过指针优化后,速度有了质的飞跃,指针计算方法要比迭代器和动态地址要快的多,根本不在一个数量级上,给大家介绍这个思路,提高你图像处理的速度,也是给自己一个忠告,多用指针去处理。
#include <cstdio>
#include <iostream>
#include <fstream>
#include <sstream>
#include<vector>
using namespace std;
#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
using namespace cv;
int main()
{
Mat src = imread("12.jpg");
Mat original = imread("12.jpg");
Mat gray;
cvtColor(src,gray,COLOR_BGR2GRAY);
std::vector<cv::Mat> channels(3);
cv::split(src, channels);
Mat aa = channels.at(0);
Mat bb = channels.at(1);
Mat cc = channels.at(2);
Mat final;
final = gray.clone();
int width = gray.cols;
int height = gray.rows;
int tmp[256];
int tmpa[256] = { 0 };
int tmpb[256] = { 0 };
int tmpc[256] = { 0 };
float C[256] = { 0.0 };
int total = width*height;
cout << "width=" << width << endl;
cout << "height=" << height << endl;
//统计每个灰度级的个数
for (int i = 0; i < gray.rows; i++)
for (int j = 0; j < gray.cols; j++)
{
int index = aa.at<uchar>(i, j);
tmpa[index]++;
}
//统计每个灰度级的个数
for (int i = 0; i < gray.rows; i++)
for (int j = 0; j < gray.cols; j++)
{
int index = bb.at<uchar>(i, j);
tmpb[index]++;
}
//统计每个灰度级的个数
for (int i = 0; i < gray.rows; i++)
for (int j = 0; j < gray.cols; j++)
{
int index = cc.at<uchar>(i, j);
tmpc[index]++;
}
for (int i = 0; i < 256;i++)
{
tmp[i] = (tmpa[i] + tmpb[i] + tmpc[i])/3;
}
限制对比度计算部分
int average = width*height / 255 / 64;
cout << "average = " << average << endl;
int LIMIT = 40 * average;
cout << "LIMIT=" << LIMIT << endl;
int steal = 0;
for (int k = 0; k < 256; k++)
{
if (tmp[k]>LIMIT)
{
steal += tmp[k]-LIMIT;
tmp[k] = LIMIT;
}
}
int bonus = steal / 256;
cout << "bonus = " << bonus << endl;
//hand out the steals averagely
for (int k = 0; k < 256; k++)
{
tmp[k] += bonus;
}
//计算累积函数
for (int i = 0; i < 256; i++)
{
if (i == 0)
C[i] = 1.0f*tmp[i] / total;
else
C[i] = C[i - 1] + 1.0f *tmp[i] / total;
}
//累积函数分配
for (int i = 0; i < gray.rows; i++)
for (int j = 0; j < gray.cols; j++)
{
int index = aa.at<uchar>(i, j);
aa.at<uchar>(i, j) = C[index] * 255;
}
//累积函数分配
for (int i = 0; i < gray.rows; i++)
for (int j = 0; j < gray.cols; j++)
{
int index = bb.at<uchar>(i, j);
bb.at<uchar>(i, j) = C[index] * 255;
}
//累积函数分配
for (int i = 0; i < gray.rows; i++)
for (int j = 0; j < gray.cols; j++)
{
int index = cc.at<uchar>(i, j);
cc.at<uchar>(i, j) = C[index] * 255;
}
channels.at(0) = aa;
channels.at(1) = bb;
channels.at(2) = cc;
//channels.at(0) = HE(channels.at(0));
//channels.at(1) = HE(channels.at(1));
//channels.at(2) = HE(channels.at(2));
merge(channels, src);
imshow("original", original);
imshow("final", src);
//imwrite("RGB合并", src);
//imwrite("gray", src);
cv::waitKey(0);
//destroyAllWindows();
return 0;
}
这是原来的代码,思想是指针,大家自行想一想,代码设计毕设,不公开了。