第一种方式:
#include
#include
using namespace cv;
using namespace std;
#define PI 3.1415926
double AverageRandom(double min, double max)//生成一个平均分布的随机数
{
int minInteger = (int)(min * 10000);
int maxInteger = (int)(max * 10000);
int randInteger = rand()*rand();
int diffInteger = maxInteger - minInteger;
int resultInteger = randInteger % diffInteger + minInteger;
return resultInteger / 10000.0;
}
double Normal2(double x, double y, double miu1, double miu2, Mat matrix, float detCov) //二维正态分布密度函数
{
float a = matrix.at(0, 0);
float b = matrix.at(0, 1);
float c = matrix.at(1, 0);
float d = matrix.at(1, 1);
double A = 2 * PI*detCov;
double B = a*(x - miu1)*(x - miu1) + (b + c)*(x - miu1)*(y - miu2) + d*(y - miu2)*(y - miu2);
//cout << "==" << 1.0 / A*exp(-0.5*B)<= z);
return p;
}//产生二维正态分布随机数
void covMatrix(float a, float b, float c, float d, Mat& inverse_matrix, float& detCov) //协方差矩阵
{
Mat cov_matrix(2, 2, CV_32FC1); //协方差矩阵
cov_matrix.at(0, 0) = a;
cov_matrix.at(0, 1) = b;
cov_matrix.at(1, 0) = c;
cov_matrix.at(1, 1) = d;
detCov = abs(a*d - b*c);
//Mat inverse_matrix(2, 2, CV_32FC1); //协方差逆矩阵
inverse_matrix.at(0, 0) = cov_matrix.at(1, 1) / detCov;
inverse_matrix.at(0, 1) = -cov_matrix.at(0, 1) / detCov;
inverse_matrix.at(1, 0) = -cov_matrix.at(1, 0) / detCov;
inverse_matrix.at(1, 1) = cov_matrix.at(0, 0) / detCov;
cout << "【默认风格】" << endl << cov_matrix << endl << endl;
cout << "【默认风格】" << endl << inverse_matrix / detCov << endl << endl;
cout << "detCov= " << detCov << endl;
}
int main()
{
Mat src(200, 200, CV_8UC1);
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
src.at(i, j) = 0;
}
}
float detCov = 0; //协方差矩阵det
Mat inverse_matrix(2, 2, CV_32FC1); //协方差逆矩阵
covMatrix(1, 0, 0, 6, inverse_matrix, detCov);
int min = 0;
int max = 200;
Point2i p;
for (int i = 0; i < 12000; i++)
{
p = NormalRandom2(100, 100, inverse_matrix,detCov,min,max);
cout << p.x << " " << p.y << endl;
src.at((int)p.x, (int)p.y) = 255;
}
imshow("src", src);
imwrite("1006.jpg", src);
waitKey(0);
return 0;
}
#include
#include
using namespace cv;
using namespace std;
#define PI 3.1415926
/*http://blog.csdn.net/fdybit/article/details/8018687*/
struct vector1
{
double x;
double y; };//二维向量
double AverageRandom(double min, double max)//生成一个平均分布的随机数
{
int minInteger = (int)(min * 10000);
int maxInteger = (int)(max * 10000);
int randInteger = rand()*rand();
int diffInteger = maxInteger - minInteger;
int resultInteger = randInteger % diffInteger + minInteger;
return resultInteger / 10000.0;
}
double Normal2(double x, double y, double miu1, double miu2, double sigma1, double sigma2, double r) //二维正态分布密度函数
{
double m = 1.0 / (sqrt(1 - r*r)*(2 * PI*sigma1*sigma2)) * exp((-1 / (2 * (1 - r*r)))*((x - miu1)*(x - miu1) / (sigma1*sigma1)
- 2 * r*(x - miu1)*(y - miu2) / (sigma1*sigma2) + (y - miu2)*(y - miu2) / (sigma2*sigma2)));
//cout << "====" << m << "=====" << endl;
return m;
}
vector1 NormalRandom2(double miu1, double miu2, double sigma1, double sigma2, double r, double min, double max)//产生二维正态分布随机数
{
vector1 vec;
double z;
double dScope;
do
{
vec.x = AverageRandom(min, max);
vec.y = AverageRandom(min, max);
z = Normal2(vec.x, vec.y, miu1, miu2, sigma1, sigma2, r);
dScope = AverageRandom(0, Normal2(miu1, miu2, miu1, miu2, sigma1, sigma2, r));
} while (dScope > z);
return vec;
}
int main()
{
struct vector1 P;
Mat src(200, 200, CV_8UC1);
for (int i = 0; i < src.rows; i++)
{
for (int j = 0; j < src.cols; j++)
{
src.at(i, j) = 0;
}
}
for (int i = 0; i < 11300; i++)
{
P = NormalRandom2(100, 100, 20, 4, 0, 0, 200);
//cout << P.x << " " << P.y << endl;
src.at((int)P.x, (int)P.y) = 255;
}
imshow("src", src);
waitKey(0);
return 0;
}