【问题标题】:Convert matlab image svd method to opencv将matlab图像svd方法转换为opencv
【发布时间】:2014-06-23 22:36:02
【问题描述】:


我想在 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 压缩有什么可做的吗?
非常感谢。
瓦希德人。

【问题讨论】:

  • “它不起作用”不足以让我们诊断您的问题。

标签: opencv svd


【解决方案1】:

这是我的代码:

   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;
    }
  • 源图像和结果图像。

【讨论】:

  • 太好了,就是这样。谢谢
猜你喜欢
  • 2015-10-09
  • 2011-12-05
  • 1970-01-01
  • 2010-12-27
  • 2011-11-29
  • 1970-01-01
  • 2020-09-15
  • 2015-05-23
  • 2011-03-02
相关资源
最近更新 更多