我寫了一個函式(在 Python 中),它以一定的質量級別(0 到 100,越高越好)保存影像。根據質量級別,最終檔案或大或小(以位元組為單位)。
我需要撰寫一個函式來為影像選擇最佳質量級別,并將其保持在最大檔案大小(以位元組為單位)以下。我能做到的唯一方法就是嘗試。
最簡單的方法是:以一定的質量保存檔案,如果它比預期的大,則降低質量等等。不幸的是,這種方法非常耗時。即使我在每次迭代時將質量降低 5 個點,風險在于我必須將同一個檔案保存 21 次才能找到合適的質量。
另一種解決方案是:嘗試使用先前質量的一半,然后根據結果專注于較低的質量范圍或較高的質量范圍。讓我澄清一下:
- 假設質量可以在 0 到 100 之間,請嘗試使用質量 = 50
- 如果檔案大小高于預期,則關注較低質量范圍(例如 0-49),否則關注較高質量范圍(例如 51-100)。
- 將質量值設定在所考慮范圍的中間并保存檔案(例如,如果范圍較低,則為 25,如果范圍較大,則為 75);回到 2
- 當范圍小于 5 時退出
第二個解決方案總是需要 6 次迭代。
這是一個 Python 實作:
limit_file_size = 512 # maximum file size, change this for different results
q_max = 100
q_min = 0
quality = q_min (q_max - q_min) // 2
while True:
file_size = save_file(quality)
if (q_max - q_min) <= 5: break
if file_size > limit_file_size:
q_max = quality
else:
q_min = quality
quality = q_min (q_max - q_min) // 2
請注意,為簡潔起見,未提供函式save_file,它的虛假實作可能如下:
import math
def save_file(quality):
return int(math.sqrt(quality))*100
How to reduce the amount of cycles required by the above function to converge to a valid solution?
uj5u.com熱心網友回復:
您可以嘗試執行您提到的二進制搜索功能,并將結果保存在字典中,以便下次迭代時檢查檔案大小質量是否已經像這樣計算出來:
# { file_size : quality }
{ 512 : 100 , 256 : 100, 1024 : 27 }
請注意,每個影像都有不同的尺寸、顏色深度、格式等,因此您可能會得到一系列結果,我建議使用它并在影響最大的屬性中創建子鍵,例如:
{ format : { file_size : quality } }
uj5u.com熱心網友回復:
您可以制定某種簡單的 ML(機器學習)方法。訓練模型給出:
- 質量 50 的影像大小
- limit_file_size
因為輸入將產生您所尋求的最佳質量,或者至少縮小您的搜索范圍,以便您需要 2-3 次迭代而不是 6 次。
因此,您必須收集訓練(和驗證)資料,訓練簡單快速的模型(應該比 更快save_file)。
我認為這是盡快確定這種質量的最佳方法,但需要大量作業(特別是如果您沒有 ML 經驗)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/313574.html
標籤:python algorithm performance
上一篇:0/1背包問題的混淆輸出
