#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <tchar.h>
#include<opencv2/opencv.hpp>
#include <opencv2/imgproc/imgproc.hpp>
using namespace cv;
int ImgArgument(Mat&img, Mat&result)
{
//***************
//p[]各个灰度级出现的概率
//p1[]各个灰度级之前的概率和
//各个灰度级出现的次数
//*****************
assert((img.cols == result.cols) && (img.rows == result.rows));
double p[256], p1[256], num[256];
int nheight = img.rows;
int nwidth = img.cols;
int total = nheight*nwidth;
memset(p, 0, sizeof(p));
memset(p1, 0, sizeof(p1));
memset(num, 0, sizeof(num));
//各个灰度级出现的次数
for (int i = 0; i < nheight; i++)
{
uchar *data = img.ptr<uchar>(i);
for (int j = 0; j < nwidth; j++)
{
num[data[j]]++;
}
}
//各个灰度级出现的概率
for (int i = 0; i < 256; i++)
{
p[i] = num[i] / total;
}
//各个灰度级之前的概率和
for (int i = 0; i < 256; i++)
{
for (int j = 0; j <= i; j++)
{
p1[i] += p[j];
}
}
//直方图变换
for (int i = 0; i < nheight; i++)
{
uchar *data = img.ptr<uchar>(i);
uchar *data0 = result.ptr<uchar>(i);
for (int j = 0; j < nwidth; j++)
{
data0[j] = p1[data[j]] * 255 + 0.5;
}
}
return 0;
}
#=======================================================
int _tmain(int argc, _TCHAR* argv[])
{
char fileName[50];
char fileName1[50];
char windowName1[50];
char windowName2[50];
cv::Mat src;
for(int i=0;i!=200;i++){
sprintf_s(fileName, "D:\\images\\src_%d.png", i); //读取图片的路径
sprintf_s(fileName1, "D:\\images_del\\src_%d.png", i); //保存图片的路径
sprintf_s(windowName1, "NO%d", i);
sprintf_s(windowName2, "Dst_NO%d", i);
src = imread(fileName, IMREAD_REDUCED_GRAYSCALE_2); //从路径中读取图片
Mat dst(src.size(), src.depth());
ImgArgument(src, dst);//图像处理过后的图片为dst
cv::imwrite(fileName1, dst); //保存处理后的图片
}
waitKey(0); //单位毫秒,0表示永远
return 0;
}
可能产生的错误:
assertion failed (size.width>0 && size.height>0) in cv::imshow,
file ……..\opencv\modules\highgui\src\window.cpp
这是由于文件路径格式不对," \ "需要转义字符:
应将Mat img = imread(“D:\images\src_%d.png”);
改为
Mat img = imread(“D:\\images\\src_%d.png”);