gpt4 book ai didi

opencv - matlab图像svd方法转opencv

转载 作者:太空宇宙 更新时间:2023-11-03 22:00:59 25 4
gpt4 key购买 nike


我想在 visual studio 中用 c++ 编写一个带有 opencv 的程序。我的代码遵循 matlab 代码:

close all
clear all
clc

%reading and converting the image
inImage=imread('pic.jpg');
inImageD=double(inImage);

[U,S,V]=svd(inImageD);

% Using different number of singular values (diagonal of S) to compress and
% reconstruct the image
dispEr = [];
numSVals = [];
for N=5:25:300
% store the singular values in a temporary var
C = S;

% discard the diagonal values not required for compression
C(N+1:end,:)=0;
C(:,N+1:end)=0;

% Construct an Image using the selected singular values
D=U*C*V';


% display and compute error
figure;
buffer = sprintf('Image output using %d singular values', N)
imshow(uint8(D));
title(buffer);
error=sum(sum((inImageD-D).^2));

% store vals for display
dispEr = [dispEr; error];
numSVals = [numSVals; N];
end

您对此有何看法?我想将图像保存在文本文件中并将其从文件中检索到 Mat 数组中。我将这部分写成如下:

Mat image;
FileStorage read_file("pic_file.txt", FileStorage::READ);
read_file["pic"] >> image;
read_file.release();
Mat P;
image.convertTo(P, CV_32FC3,1.0/255);
SVD svda(P); //or SVD::compute(P,W,U,V);

但是我对 SVD 函数有问题,它不起作用。计算图像的 SVD 压缩有什么可做的吗?
非常感谢。
瓦希德。

最佳答案

这是我的代码:

   int main(int argc, char* argv[])
{
// Image matrix
Mat img;
Mat result;
//---------------------------------------------
//
//---------------------------------------------
namedWindow("Source Image");

namedWindow("Result");
// Load image in grayscale mode
img=imread("D:\\ImagesForTest\\cat.bmp",0);
img.convertTo(img,CV_32FC1,1.0/255.0);
cout << "Source size:" << img.rows*img.cols <<" elements "<< endl;
// create SVD
cv::SVD s;
// svd result
Mat w,u,vt;
// computations ...
s.compute(img,w,u,vt);

// collect Sigma matrix (diagonal - is eigen values, other - zeros)
// we got it in as vector, transform it to diagonal matrix
Mat W=Mat::zeros(w.rows,w.rows,CV_32FC1);
for(int i=0;i<w.rows;i++)
{
W.at<float>(i,i)=w.at<float>(i);
}

// reduce rank to k
int k=25;
W=W(Range(0,k),Range(0,k));
u=u(Range::all(),Range(0,k));
vt=vt(Range(0,k),Range::all());

// Get compressed image
result=u*W*vt;
cout << "Result size:" << u.rows*u.cols+k+vt.rows*vt.cols <<" elements "<< endl;
//---------------------------------------------
//
//---------------------------------------------
imshow("Source Image", img);
imshow("Result", result);
cvWaitKey(0);
return 0;
}
  • 源图像和结果图像。

Source and result images.

关于opencv - matlab图像svd方法转opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24364794/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com