1图片导入及预处理
1.1导入图片
//导入图片,并将其转入矩阵image中
Mat image = imread("test.jpg", IMREAD_REDUCED_GRAYSCALE_2);
//灰度形式,单通道转入
1.2预处理
//将矩阵转为可以处理的数据形式
Mat srcimage;
image.convertTo(srcimage, CV_32FC1);
//如果图片不为方阵,则可通过resize,creat等函数处理
2求解并处理特征值及特征向量
2.1获取并随机保留特征值
为方便起见,各取矩阵的上三角和下三角,分别视为两个实对称阵依次求解
//上三角阵处理方式
//获取特征值及特征向量
eigen(srcimage,vals, vecs);
//生成随机数,任意保留50个特征值
int i=0,k=0;
unsigned r;
cin >> r;
srand(r);
while (i = rand() % (vals.rows) + 1)
{
if (k ==(vals.rows-50)) break;
vals.at<float>(i, 0) = 0;
k++;
}
2.2处理特征值及特征向量矩阵
将特征值所在的行向量转为对角阵
Mat dia_vals(vals.rows, vals.rows, vals.type(),Scalar(0));
float* vals_data = vals.ptr<float>(0);
for (i=0; i < vals.rows; i++)
{
diagonal_vals.ptr<float>(i)[i] = vals_data[i];
}
处理特征向量
vecs=vecs.t();//转置
//...
invert(vecs, vecs_inv);//求逆
//...
//重新生成图片对应的矩阵,并转换格式以生成图片
e = vecs * dia_vals * vecs_inv;
e.convertTo(e, CV_8UC1);
3图片拼接
3.1导入图片并预处理
Mat image = imread("test1.jpg", IMREAD_REDUCED_GRAYSCALE_2),
timage= imread("test2.jpg", IMREAD_REDUCED_GRAYSCALE_2);
Mat srcimage,tsrcimage;
image.convertTo(srcimage, CV_32FC1);
timage.convertTo(tsrcimage, CV_32FC1);
3.2图片拼接
//将上三角阵的左下部分替换为下三角阵的对应元素
int i=0,j = 0;
for (i = 0; i < srcimage.rows; i++)
{
for ( ; j < i; j++)
{
srcimage.at<float>(i, j) = tsrcimage.at<float>(i, j);
}
j=0;
}
//...
//
imwrite("test0.jpg", srcimage);//保存图片
4效果
原图片:
生成的对称图片:
下三角:
上三角:
随机保留50个特征值,所得到的图片: