最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于Python的OpenCV庫(kù)實(shí)現(xiàn)圖像的安全讀取與保存指南

 更新時(shí)間:2025年12月17日 10:06:08   作者:Dfreedom.  
本文介紹了基于OpenCV的健壯圖像讀取和保存方案,解決了中文路徑處理、格式兼容性和圖像質(zhì)量保持等常見問(wèn)題,適用于科學(xué)圖像和醫(yī)學(xué)圖像等對(duì)數(shù)據(jù)完整性要求較高的場(chǎng)景,需要的朋友可以參考下

1 常用函數(shù)介紹

1.1 圖像讀取的核心函數(shù)

在OpenCV中,cv2.imread() 是主要的圖像讀取函數(shù),但它有一個(gè)明顯的限制:無(wú)法直接處理中文路徑。這就是為什么我們需要采用更安全可靠的讀取方法。

def image_read(self)->np.ndarray:
    """安全讀取中文路徑的圖像,支持單通道、三通道(BGR)、四通道(BGRA)"""
    # 二進(jìn)制讀取 + OpenCV解碼
    source_path = Path(self.source_image_path)
    raw_data = np.fromfile(source_path, dtype=np.uint8)
    return cv2.imdecode(raw_data, cv2.IMREAD_UNCHANGED)  # 保留原始通道信息

這種方法的核心優(yōu)勢(shì)在于:

  • 規(guī)避中文路徑問(wèn)題:通過(guò)np.fromfile以二進(jìn)制方式讀取文件,完全繞過(guò)路徑編碼問(wèn)題
  • 保留原始信息:使用cv2.IMREAD_UNCHANGED參數(shù)確保圖像的通道數(shù)和位深不被修改
  • 格式兼容性強(qiáng):支持TIFF、PNG、JPEG等多種圖像格式

1.2 圖像保存的智能實(shí)現(xiàn)

圖像保存同樣需要特別注意格式兼容性和質(zhì)量保持:

def image_write(self, image:np.ndarray, file_extension:str ='.tif')->bool:
    # 根據(jù)不同格式設(shè)置優(yōu)化參數(shù)
    if file_extension in ['.tif', '.tiff']:
        encode_params = [cv2.IMWRITE_TIFF_COMPRESSION, 1]  # 無(wú)壓縮
    elif file_extension in ['.png']:
        encode_params = [cv2.IMWRITE_PNG_COMPRESSION, 0]   # 無(wú)壓縮
    # ... 其他格式處理

OpenCV的cv2.imwrite()函數(shù)支持多種圖像格式,包括JPEG、PNG、BMP和TIFF等,只需通過(guò)文件擴(kuò)展名即可指定輸出格式。

2 圖像讀取和保存的常見場(chǎng)景

2.1 單文件處理場(chǎng)景

對(duì)于單個(gè)圖像文件的處理,我們的類提供了直接的接口:

# 單個(gè)圖像文件的讀取和保存
source_path = "輸入圖像路徑.tif"
target_path = "輸出圖像路徑.png"

image_io = ImageIO(source_path, target_path)
image = image_io.image_read()  # 讀取圖像
success = image_io.image_write(image, ".png")  # 保存為PNG格式

這種場(chǎng)景適用于:

  • 格式轉(zhuǎn)換:將圖像從一種格式轉(zhuǎn)換為另一種格式
  • 簡(jiǎn)單處理:讀取-處理-保存的簡(jiǎn)單工作流
  • 質(zhì)量檢查:驗(yàn)證圖像能否正常讀取和保存

2.2 批量處理場(chǎng)景

在實(shí)際項(xiàng)目中,經(jīng)常需要處理整個(gè)文件夾中的圖像:

source_folder = Path("源文件夾")
target_folder = Path("目標(biāo)文件夾")
file_io = FileIO(source_folder, target_folder)

# 獲取所有圖像文件路徑
image_paths = file_io.filter_by_strings(file_io.list_file_paths(True), [".tif", ".jpg"], True)

for image_path in image_paths:
    source_image_path = Path(image_path)
    target_image_path = target_folder / source_image_path.name
    image_io = ImageIO(source_image_path, target_image_path)
    image = image_io.image_read()
    image_io.image_write(image, ".tif")  # 保持原格式或轉(zhuǎn)換為指定格式

批量處理需要注意:

  • 文件過(guò)濾:根據(jù)擴(kuò)展名篩選目標(biāo)圖像文件
  • 路徑管理:正確構(gòu)建源路徑和目標(biāo)路徑
  • 錯(cuò)誤處理:確保單個(gè)文件處理失敗不影響整體流程

3 實(shí)例演示

3.1 完整的工作流程示例

以下是一個(gè)完整的圖像處理流程示例,展示了從讀取到保存的整個(gè)過(guò)程:

from pathlib import Path
import cv2
import numpy as np
from submodule.file_io import FileIO
#ImageIO類只涉及到圖像數(shù)據(jù)的讀取和儲(chǔ)存,不涉及到圖像數(shù)據(jù)的修改
class ImageIO:

    def __init__(self, source_image_path: None | str | Path, target_image_path: None | str | Path) -> None:
        """
        初始化 FileIO 實(shí)例

        Args:
            source_image_path: 讀取圖像路徑。如果提供,會(huì)檢查其是否存在。
            target_image_path: 保存圖像路徑。保存時(shí)必須提供
        """
        # 處理源文件夾:如果提供則轉(zhuǎn)換為Path,并檢查存在性(但不創(chuàng)建)
        self.source_image_path = Path(source_image_path) if source_image_path is not None else None
        if self.source_image_path is not None and not self.source_image_path.exists():
            # 根據(jù)你的需求決定:如果源文件夾必須存在,可以拋出異常
            # raise ValueError(f"源目錄不存在: {self.source_folder}")
            # 或者僅記錄警告,取決于你的業(yè)務(wù)邏輯
            print(f"警告: 源文件可能不存在: {self.source_image_path}")
        self.target_image_path = Path(target_image_path)

    def image_read(self)->np.ndarray:
        """安全讀取中文路徑的圖像,支持單通道、三通道(BGR)、四通道(BGRA)"""
        # 二進(jìn)制讀取 + OpenCV解碼
        source_path = Path(self.source_image_path)
        raw_data = np.fromfile(source_path, dtype=np.uint8)
        return cv2.imdecode(raw_data, cv2.IMREAD_UNCHANGED)  # 保留原始通道信息

    def image_write(self, image:np.ndarray, file_extension:str ='.tif')->bool:
        """安全保存圖像(支持中文路徑),支持多種格式的無(wú)損保存

        Args:
            image: 要保存的圖像數(shù)據(jù)
            file_extension: 文件擴(kuò)展名,支持 '.tif','.tiff', '.png', '.jpg', '.jpeg', '.webp' 等

        Returns:
            bool: 保存成功返回True,否則返回False
        """
        target_image_path= Path(self.target_image_path)


        # 根據(jù)文件擴(kuò)展名設(shè)置不同的無(wú)損保存參數(shù) [1,7,10](@ref)
        file_extension = file_extension.lower()

        if file_extension in ['.tif', '.tiff']:
            # TIFF格式:使用無(wú)壓縮 [7](@ref)
            encode_params = [cv2.IMWRITE_TIFF_COMPRESSION, 1]
        elif file_extension in ['.png']:
            # PNG格式:壓縮級(jí)別0(不壓縮)[7](@ref)
            encode_params = [cv2.IMWRITE_PNG_COMPRESSION, 0]
        elif file_extension in ['.jpg', '.jpeg']:
            # JPEG格式:最高質(zhì)量100(雖然JPEG固有有損,但100是最小損失)[1](@ref)
            encode_params = [cv2.IMWRITE_JPEG_QUALITY, 100]
        elif file_extension in ['.webp']:
            # WebP格式:最高質(zhì)量100 [10](@ref)
            encode_params = [cv2.IMWRITE_WEBP_QUALITY, 100]
        else:
            # 其他格式不使用壓縮參數(shù)
            encode_params = []

        # 使用imencode避免中文路徑問(wèn)題 [8](@ref)
        success, encoded_image = cv2.imencode(file_extension, image, params=encode_params)

        if success:
            encoded_image.tofile(target_image_path)
            return True
        else:
            print(f"圖像保存失敗,格式: {file_extension}")
            return False
if __name__ == "__main__":
    source_folder = Path(r"source")
    target_folder = Path(r"target")
    file_io = FileIO(source_folder, target_folder)#創(chuàng)建FileIO實(shí)例處理文件列表
    file_paths = file_io.list_file_paths(True) #獲取所有文件路徑
    image_paths = file_io.filter_by_strings(file_paths,[".tif"],True)#獲取.tif文件的路徑
    file_io.clear_folder(target_folder)# 清空目標(biāo)文件夾(謹(jǐn)慎使用)
    # 處理每個(gè)圖像
    for image_path in image_paths:
        source_image_path = Path(image_path) #目標(biāo)圖像路徑
        target_image_path = target_folder / source_image_path.name #要保存的圖像路徑,可以修改名稱來(lái)重命名
        image_io = ImageIO(source_image_path,target_image_path) #實(shí)例化ImageIO類
        image = image_io.image_read() #讀取目標(biāo)圖像數(shù)據(jù),BGR

        # 可在此處添加圖像處理代碼
        # 例如:調(diào)整大小、應(yīng)用濾鏡等

        image_io.image_write(image,file_extension=".tif") #保存圖像數(shù)據(jù)至目標(biāo)文件夾,可以設(shè)置指定格式
        print("成功讀取并保存:", f"{source_image_path} -> {target_image_path}")

3.2 不同格式的處理示例

不同的圖像格式有不同的特點(diǎn)和適用場(chǎng)景:

  • TIFF格式:適合需要無(wú)損保存的科學(xué)圖像和醫(yī)學(xué)圖像
  • PNG格式:適合需要透明通道的圖像,無(wú)損壓縮
  • JPEG格式:適合照片類圖像,有損壓縮但文件較小
  • WebP格式:現(xiàn)代格式,提供優(yōu)秀的壓縮率

4 常見問(wèn)題及解決方案

4.1 中文路徑問(wèn)題

問(wèn)題描述:直接使用cv2.imread()讀取包含中文路徑的文件時(shí)返回None

解決方案:采用二進(jìn)制讀取+解碼的方式:

raw_data = np.fromfile(source_path, dtype=np.uint8)
image = cv2.imdecode(raw_data, cv2.IMREAD_UNCHANGED)

4.2 圖像保存失敗

問(wèn)題描述cv2.imwrite()返回False,圖像保存失敗。

可能原因和解決方案

  • 目標(biāo)路徑不存在:確保目標(biāo)目錄已創(chuàng)建
target_path.parent.mkdir(parents=True, exist_ok=True)
  1. 權(quán)限問(wèn)題:檢查是否有寫入權(quán)限
  2. 磁盤空間不足:檢查磁盤空間

4.3 通道順序問(wèn)題

問(wèn)題描述:OpenCV使用BGR通道順序,而其他庫(kù)(如Matplotlib)使用RGB順序,導(dǎo)致顏色顯示異常。

解決方案:在顯示前轉(zhuǎn)換通道順序:

# 將BGR轉(zhuǎn)換為RGB
image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB)

4.4 圖像質(zhì)量保持

問(wèn)題描述:保存后圖像質(zhì)量下降。

解決方案:根據(jù)格式設(shè)置合適的保存參數(shù):

  • JPEG:設(shè)置質(zhì)量參數(shù)為95-100
  • PNG:設(shè)置壓縮級(jí)別為0(無(wú)壓縮)
  • TIFF:使用無(wú)損壓縮選項(xiàng)

5 總結(jié)

本文介紹了一套基于OpenCV的健壯圖像讀取和保存方案,重點(diǎn)解決了中文路徑處理、格式兼容性和圖像質(zhì)量保持等常見問(wèn)題。通過(guò)ImageIO類的封裝,實(shí)現(xiàn)了:

  1. 安全讀取:通過(guò)二進(jìn)制讀取+解碼的方式規(guī)避中文路徑問(wèn)題
  2. 靈活保存:支持多種圖像格式,并能根據(jù)格式特點(diǎn)優(yōu)化保存參數(shù)
  3. 批量處理:提供完整的文件夾級(jí)處理方案
  4. 錯(cuò)誤處理:添加適當(dāng)?shù)漠惓L幚硖岣叽a健壯性

以上就是基于Python的OpenCV庫(kù)實(shí)現(xiàn)圖像的安全讀取與保存指南的詳細(xì)內(nèi)容,更多關(guān)于Python OpenCV圖像讀取與保存的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Pandas_cum累積計(jì)算和rolling滾動(dòng)計(jì)算的用法詳解

    Pandas_cum累積計(jì)算和rolling滾動(dòng)計(jì)算的用法詳解

    今天小編就為大家分享一篇Pandas_cum累積計(jì)算和rolling滾動(dòng)計(jì)算的用法詳解,具有好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-07-07
  • 使用Python和PaddleOCR實(shí)現(xiàn)圖文識(shí)別的代碼和步驟

    使用Python和PaddleOCR實(shí)現(xiàn)圖文識(shí)別的代碼和步驟

    在當(dāng)今數(shù)字化時(shí)代,圖文識(shí)別技術(shù)的應(yīng)用越來(lái)越廣泛,如文檔數(shù)字化、信息提取等,PaddleOCR 是百度開源的一款強(qiáng)大的 OCR 工具包,它集成了多種先進(jìn)的算法和模型,本文將詳細(xì)介紹如何使用 PaddleOCR 和 Python 實(shí)現(xiàn)圖文識(shí)別,需要的朋友可以參考下
    2025-05-05
  • Python?matplotlib可視化之繪制韋恩圖

    Python?matplotlib可視化之繪制韋恩圖

    韋恩圖可以清晰的反映不同組數(shù)據(jù)共有和各自獨(dú)有的部分,本文將詳細(xì)為大家介紹如下兩種python繪制venn圖策略:matplotlib_venn和pyvenn,需要的可以參考一下
    2022-02-02
  • python怎么使用xlwt操作excel你知道嗎

    python怎么使用xlwt操作excel你知道嗎

    這篇文章主要為大家介紹了python使用xlwt操作excel的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-01-01
  • Django實(shí)現(xiàn)auth模塊下的登錄注冊(cè)與注銷功能

    Django實(shí)現(xiàn)auth模塊下的登錄注冊(cè)與注銷功能

    這篇文章主要介紹了Django實(shí)現(xiàn)auth模塊下的登錄注冊(cè)與注銷功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • 對(duì)python3中, print橫向輸出的方法詳解

    對(duì)python3中, print橫向輸出的方法詳解

    今天小編就為大家分享一篇對(duì)python3中, print橫向輸出的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • python編程培訓(xùn) python培訓(xùn)靠譜嗎

    python編程培訓(xùn) python培訓(xùn)靠譜嗎

    現(xiàn)在大家都知道,比較火的編程語(yǔ)言就是python了,很多朋友都想學(xué)習(xí)python編程,想上一個(gè)好的python培訓(xùn)班,小編今天給大家全面分析一下關(guān)于python編程培訓(xùn)方面的問(wèn)題,希望能給你答疑解惑。
    2018-01-01
  • Python?文件操作方法總結(jié)

    Python?文件操作方法總結(jié)

    這篇文章主要介紹了Python?文件操作方法總結(jié),文章基于python的基礎(chǔ)展開Python?文件操作方法,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-05-05
  • Django驗(yàn)證碼的生成與使用示例

    Django驗(yàn)證碼的生成與使用示例

    關(guān)于django的驗(yàn)證碼的使用,在網(wǎng)上找到了相關(guān)的資料,現(xiàn)在整理一下分享給大家,下面這篇文章主要給大家介紹了關(guān)于Django驗(yàn)證碼的生成與使用的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-05-05
  • Python用requests庫(kù)爬取返回為空的解決辦法

    Python用requests庫(kù)爬取返回為空的解決辦法

    這篇文章主要介紹了Python用requests庫(kù)爬取返回為空的解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02

最新評(píng)論

普洱| 北流市| 固阳县| 常德市| 濮阳县| 镇巴县| 东乌珠穆沁旗| 湖州市| 瑞安市| 远安县| 琼海市| 定日县| 闵行区| 青阳县| 河南省| 平和县| 扶余县| 香港 | 天全县| 平泉县| 肃宁县| 车致| 隆昌县| 鹰潭市| 大同县| 泾川县| 富蕴县| 郯城县| 霍城县| 许昌市| 宕昌县| 盐源县| 灵丘县| 金阳县| 涿州市| 西峡县| 萝北县| 宣化县| 汤阴县| 宁明县| 亚东县|