2016-12-15 1053 views
1

我剛開始關注OpenCV,我看過一些類似的問題,但是我沒有找到有用的答案。我有許多像素尺寸爲50寬和50高(縮略圖尺寸)的圖像。使用opencv增加圖像比例和最大化分辨率?

我輕度的意識模糊有關以下內容:

問:通過增加這些圖像的規模,我會自動提高分辨率?或者我需要執行另一個功能?

它的基本要素是我可以獲得最大分辨率,同時增加圖像的比例。

我使用下面的功能:

int IncreaseScale() 
{ 
    char *image_name {"./image/my_image.jpg"}; 
    cv::Mat Image; 
    Image = cv::imread(image_name, 1); 
    if(!Image.data) 
    { 
    //Cant find image 
    return 0; 
    } 
    const float rescale_value {4.10}; 
    cv::Mat Image2; 
    cv::resize(Image, Image2, cvSize(0, 0), rescale_value, rescale_value); 
    return 1; 
} 
+1

假設您在兩個維度中都調整了係數2。你只知道1/4像素的真實值。你需要討論剩下的價值。這稱爲_interpolation_。您可以使用不同類型的插值,您可以選擇其作爲調整大小函數中的最後一個參數。所以不行。你不是在提高分辨率......只是最好的填充洞 – Miki

+0

謝謝@Miki - 是否有任何技術可以用來提高分辨率? –

回答

2

正如此前人們所述,在增加圖像大小時,使用插值法非常有限。當您增加圖像的分辨率時,您正在使用先前分辨率的像素來猜測它們的值。雖然圖像的分辨率會更高,但質量並不會更好。

已經提出來克服這個問題的一種技術是super resolution的想法。這個想法是,當你看一個場景時,你會看到幾個不同的圖像,看着不同的視角。每幅圖像都提供了其他圖像以前未見過的信息中的細微差異。您可以確定每個視點的獨特之處,然後將這些信息結合在一起,形成更高質量的增強圖像流。這不幸的是不能用於單個圖像,因爲沒有附加信息從圖像流中提取。您可以使用可以使用同一視點的多個圖像。在相機傳感器中引入的噪聲輪廓應該足以向超分辨率算法提供不同的信息,以產生更高質量的放大圖像。事實上,超分辨率的想法是拍攝幾張「低質量」的圖像,並通過將其信息組合成最終圖像來創造高質量的結果。這個想法已經存在了一段時間,不僅與圖像處理有關,而且還涉及顯微鏡和科學成像的各個領域。

僅使用單個圖像進入人工創建超分辨率圖像的區域,這可能會影響也可能不會影響取決於圖像。擁有一串圖像將有更高的成功可能性。你可以在這裏閱讀關於超分辨率的更多細節:http://www.infognition.com/articles/what_is_super_resolution.html

幸運的是,OpenCV確實有一個模塊實現超分辨率,它在Super Resolution module中找到。您需要輸入一系列圖像,輸出的是一系列圖像,這些圖像在所需的更高分辨率下具有更高的質量。

有關如何使用超分辨率模塊的代碼示例,請參閱OpenCV的Github代碼:https://github.com/opencv/opencv/blob/master/samples/gpu/super_resolution.cpp。不要被愚弄在信息源所在的位置。儘管它置於GPU示例之下,但代碼的設計目的是處理CPU和GPU情況,正如您在if語句中看到的那樣。該代碼只需輸入一個視頻輸入並且具有所需的分辨率,則輸出基於超分辨率的結果。

1

是的,這個代碼是有效的做了4.1倍「數碼變焦」,所以輸出的圖像應該有這樣的205 X 205分辨率,或什麼的。當未指定時,調整大小使用bilinear interpolation進行上採樣。結果將有更高的分辨率,但不會比原始的低分辨率圖像更清晰。