簡體   English   中英

壓縮感知 - 為什么我的凸求解器在我給它*更多*樣本時會失敗?

[英]Compressed sensing - Why does my convex solver fail when I give it *more* samples?

我正在嘗試使用 MATLAB 的 cvx來實現圖像的壓縮感知。 這與 Steve Brunton 在此處的示例中使用的庫相同。 我的測試圖像是Lenna

這是我的 MATLAB 腳本:

 close all; clear; clc % read in an image lenna = imread('lenna.png'); X = lenna(:, :, 2); % greem channel only X = X(200:249, 100:149); % just a chunk M = size(X, 1); N = size(X, 2); x = vectorify(X); figure, subplot(1, 3, 1), imshow(X), title(strcat("Original Image: ", num2str(M), " by ", num2str(N), " Pixels")) % Sample randomly K = 80; %number of random sampled pixels c = randsample(numel(X), K); %locations of pixels as a list y = x(c); %values C = zeros(K, numel(X)); %C(c) = y;%(1:K); Y = zeros(M, N); % there must be a more elegant way to do this... for k=1:KC(k, c(k)) = y(k); Y2 = rectanglefy(C(k, :), M, N); Y=Y+Y2; end % Y=rectanglefy(C, M, N) C = C>0; %convert C to a binary matrix C = double(C); %cast subplot(1, 3, 2), imshow(Y/255), title(strcat(num2str(K), ' Sampled Pixels')) % Solve for sparse representation psi = dftmtx(M*N); psi=real(psi); Theta = C*psi; n = M*N; Theta = double(Theta); y = double(y); %cast required cvx_begin; variable s_L1(n) minimize( norm(s_L1, 1) ); subject to Theta * s_L1 ==y; cvx_end xr = psi*s_L1; Xr = rectanglefy(xr, M, N); subplot(1, 3, 3), imshow(Xr/255), title('Reconstructed Image') function x = vectorify(X) x = reshape(X, [numel(X), 1]); end function X = rectanglefy(x, M, N) X = reshape(x, [M, N]); end

當我使用 K=80 運行它時,它能夠重建圖像,雖然它當然不是很接近真實的東西: 50x50 像素的圖像重建,具有 80 個隨機采樣的像素。

但是,如果我將樣本數量增加到 800 - 我希望這會使結果更接近 - 求解器告訴我這是不可行的: 嘗試使用 800 個隨機采樣像素重建圖像,並在命令窗口中顯示來自 cvx 求解器的文本,說明求解不可行。

在這兩者之間,如果我將 K 設置為 180 個隨機樣本,求解器會產生“失敗”,這顯然與“不可行”的結果不同: 嘗試使用 180 個隨機采樣像素重建圖像,並在命令窗口中顯示來自 cvx 求解器的文本,說明求解失敗。

我不確定問題出在我的代碼中還是我對凸優化的理解(相當差),但我的問題是:(a)為什么會發生這種情況? (b) 我應該做些什么來重建這個圖像?

所以我有點像猿,在這方面沒有太多經驗,但我試圖復制你的代碼,到目前為止我得到了 2 個提示:

1:如果你像這樣定義 cvx 部分,你會得到更好的結果(通過增加采樣點會變得更好:

epsilon=0.01;
%Using the cvx
cvx_begin;
    variable s_L1(n) complex
    minimize( norm(s_L1, 1) );
    subject to
        norm(y - Theta*s_L1,2) <= epsilon; 
cvx_end

2:您將 2D 圖像逐列轉換為 1D 向量,這意味着您的第一個元素和第 51 個元素具有非常高的相關性。 我想你最好使用 2d fft,像這樣,但我不確定現在如何實現它。 如果您仍然對該主題感興趣,我很樂意分享我發現的任何內容。 :)

希望有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM