Python使用OpenCV實(shí)現(xiàn)圖片的批量壓縮
1. 前言
在日常開發(fā)中,我們經(jīng)常需要處理大量的圖片文件,例如調(diào)整圖片大小以適應(yīng)不同的顯示需求或減少存儲空間。本文將介紹如何使用Python和OpenCV庫來批量壓縮圖片,并對實(shí)現(xiàn)相同功能的技術(shù)進(jìn)行對比分析。
2. 技術(shù)對比選擇
Pillow庫: Pillow是Python Imaging Library (PIL) 的一個(gè)分支,提供了豐富的圖像處理功能。與OpenCV相比,Pillow更專注于圖像處理,API更加簡潔易用。但是,OpenCV在處理計(jì)算機(jī)視覺任務(wù)時(shí)更加強(qiáng)大。
ImageMagick: ImageMagick是一個(gè)功能強(qiáng)大的圖像處理工具集,支持多種編程語言。它提供了命令行工具和編程接口,可以處理各種圖像格式。與OpenCV相比,ImageMagick在處理復(fù)雜圖像操作時(shí)更加靈活,但學(xué)習(xí)曲線較陡峭。
OpenCV:之所以采用 OpenCV,是因?yàn)橹皩W(xué)習(xí)過 OpenCV,同時(shí)之前使用 Pillow 實(shí)現(xiàn)過批量圖片壓縮,所以這次開發(fā)使用 OpenCV。
3. 實(shí)現(xiàn)分析
讀取圖片: 使用cv2.imread()函數(shù)讀取圖片文件。如果圖片無法讀取,函數(shù)會返回None,此時(shí)程序會輸出錯(cuò)誤信息并返回。
計(jì)算新高度: 為了保持圖片的寬高比,我們需要根據(jù)指定的寬度計(jì)算新的高度。公式為:height = int(width * image.shape[0] / image.shape[1]),其中image.shape[0]是原圖片的高度,image.shape[1]是原圖片的寬度。
調(diào)整圖片大小: 使用cv2.resize()函數(shù)調(diào)整圖片大小。interpolation=cv2.INTER_AREA參數(shù)用于指定插值方法,該方法在縮小圖片時(shí)效果較好。
保存圖片: 使用cv2.imwrite()函數(shù)將調(diào)整大小后的圖片保存到指定路徑。
4. 壓縮實(shí)現(xiàn)代碼
實(shí)現(xiàn)圖片壓縮的核心代碼:
import cv2
import os
def resize_image(input_path, output_path, width=600):
# 讀取圖片
image = cv2.imread(input_path)
if image is None:
print(f"無法讀取圖片: {input_path}")
return
# 計(jì)算新的高度以保持寬高比
height = int(width * image.shape[0] / image.shape[1])
# 調(diào)整圖片大小
resized_image = cv2.resize(image, (width, height), interpolation=cv2.INTER_AREA)
# 保存圖片
cv2.imwrite(output_path, resized_image)
print(f"已保存: {output_path}")
5. 批量處理實(shí)現(xiàn)
在主函數(shù),用于遍歷文件夾中的所有圖片文件并調(diào)用resize_image函數(shù)進(jìn)行處理:
def main():
# 輸入和輸出文件夾路徑
input_folder = "images"
output_folder = "output"
# 創(chuàng)建輸出文件夾(如果不存在)
os.makedirs(output_folder, exist_ok=True)
# 遍歷輸入文件夾中的所有圖片文件
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
input_path = os.path.join(input_folder, filename)
output_path = os.path.join(output_folder, filename)
resize_image(input_path, output_path)
if __name__ == "__main__":
main()
6. 執(zhí)行代碼效果

7. 處理前圖片
具體圖片文件分辨率和大小

所有圖片的大小

8. 處理后圖片
具體圖片文件分辨率和大小

所有圖片的大小

9.總結(jié)
使用 OpenCV 庫來批量壓縮圖片。通過cv2.imread()、cv2.resize()和cv2.imwrite()等函數(shù),我們可以輕松實(shí)現(xiàn)圖片的讀取、調(diào)整大小和保存。
對比了其他實(shí)現(xiàn)相同功能的技術(shù),如Pillow庫和ImageMagick。在實(shí)際開發(fā)中,我們可以根據(jù)具體需求選擇合適的技術(shù)來處理圖片。
由于圖片是給手機(jī)端使用,又擔(dān)心圖片的分辨率太低,導(dǎo)致在手機(jī)上展示效果不好,因此最后設(shè)置寬度是 600px,即便如此,也可以看出整體圖片的總壓縮將近15倍,當(dāng)然具體的不能這么計(jì)算,但是在移動端訪問的確解決了問題。
到此這篇關(guān)于Python使用OpenCV實(shí)現(xiàn)圖片的批量壓縮的文章就介紹到這了,更多相關(guān)OpenCV圖片壓縮內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python列表排序如何使用key參數(shù)掌控排序規(guī)則
這篇文章介紹了Python列表排序如何使用key參數(shù)掌控排序規(guī)則,文章討論了sort()和sorted()方法的區(qū)別,以及如何選擇合適的排序工具,最后,通過實(shí)戰(zhàn)案例展示了key參數(shù)的靈活應(yīng)用,感興趣的朋友跟隨小編一起看看吧2026-02-02

