python圖像處理庫教程(用python處理圖像)

本文目錄一覽:

1.圖像裁剪、加邊框、旋轉(Python PIL)

        日常工作中經常要用Photoshop打印一些地質圖,雖然說PS有動作錄製的功能,但是打印這個功能我嘗試過錄製動作後並未能成功運行,而且要打印的圖像尺寸很多都是不同的,試了幾次後就放棄了,直到後來Python學起來了,通過pywinauto庫實現了這個功能,在這裡就簡單記錄下吧。

        在寫Photoshop的打印操作之前,先來回顧下打印之前的圖像處理工作。

        接到的地質圖多為MapGIS程序導出的jpg圖片,偶爾也會有Tif格式的遙感圖。對這些圖像進行打印很簡單,基本流程是:用PS打開圖像-裁剪圖像四周空白邊緣-為圖像四周加上3cm寬白色邊框(為了美觀和裝訂的需要)-打印。那為啥用PS來打印不直接用Windows自帶打印呢,應該是打印需要用到PS特定的顏色處理模式吧,經過試驗,通過兩種方式打出來的色彩效果確實是不同的。

        打印前圖像處理的主要目標很簡單:

                1、裁剪圖像四周空白

                2、為圖像四周加上3cm白色邊框   

下面就用Python實現它們

圖像處理主要用的是PIL這個庫,中途由於單位電腦比較舊(4g內存Win7 32位系統,後來重裝成64位了,體驗就是搞這種東西必須整個64位系統),性能不太行了,也用Opencv整了下,還是感覺PIL稍微快那麼一點點,不知道是不是錯覺呢。

(後來發現這兩步在PS錄個動作也能輕鬆完成(→ܫ←))

一、獲取所有圖片路徑

        有時候要打印的圖片會放在好多個不同文件夾裏面,要把它們遍歷出來:

import os

二、讀取圖片並裁剪四周空白

import PIL

獲得了圖像尺寸後接下來就要對圖像進行邊緣空白的裁剪了(其實這兩步不分先後順序的):

裁剪的思路是網上搜到的,整理下就是:

    1、先把圖像轉成灰度模式(值變成單一的0-255以方便判斷,如果要裁剪其他顏色我就不知道了,我這裡只要裁掉最常見的由MapGIS導出的標準的白色邊緣)。

    2、分別從四個方向掃描圖像,找到四個方向各自第一個灰度值不為255(最純粹的白色(→ܫ←))的像素,記下它的坐標(i,j)。

    3、通過四組坐標大小比較,得到圖像除了四周空白區域外的坐標極值,也就得到了裁剪的區域左上(left,top)和右下坐標(right,bottom)。

    4、利用PIL.Image.crop(),完成圖像的裁剪。

    5、沒了,就是後來發現PIL自帶這個算法,引用一下: 使用PIL裁剪圖片白邊

        要是用PS來做呢,『圖像-裁切-確定』就完事了。

三、給裁剪後的圖像加上x厘米的白色邊框

這一步主要是為了打印出來的圖規範且美觀。

這一步要是用PS來搞,『圖像-畫布大小-設置相對的寬度和高度』 就好了

四、判斷圖像是否需要旋轉。

為什麼要旋轉這些圖像呢?因為最終是要把它們用打印機打印出來,而打印機能打印的最大寬度是有限的,所以就有了這個步驟。

單位的打印機型號是惠普的HP DesignJet Z6200 60 英寸照片打印機,最大打印紙張寬度是60英寸,大約就是1524mm左右吧,除了最大尺寸外,日常還用到的紙張寬度有440、610、914、1067、1274等6、7種吧,所以出於節約打印時間和省錢的考慮,為每張圖選擇最合適的打印紙張寬度也是很有必要的。

判斷圖像是否需要旋轉的思路是這樣的:

    1、比較圖像的寬和高,判斷誰是圖像的長邊和短邊。

    2、短邊如果大於1524mm,這圖按1:1就打不出來了,超過打印機最大可裝入的紙張的寬度,把這個圖像文件放到Oversize_path路徑下,後續自己看着辦。

    3、在短邊小於等於1524mm的前提下,根據對圖像寬高和長短邊的比較,有兩種需要旋轉的情況:

            3.1 如果圖像的寬是長邊(矮胖的矩形),且寬大於1524mm,那麼這圖得旋轉90°;

            3.2 如果圖像的高是長邊(瘦高的矩形),且高小於1524mm,那麼這圖也得旋轉90°。

*printTOtkinter()是個用tkinter搞的進度顯示窗口,就輸出下一些文本信息而已。

五、為圖像選擇最合適的打印紙張尺寸

單位打印紙有438、610、914、1524等7種寬度,現在要選出最適合的一種來進行打印。

在把短邊大於1524這種情況排除之後,剩下的圖像情況為短邊小於1524,即單位的打印機能打印出來了。

這時要判斷最佳打印用紙的寬度,有兩種情況需要考慮:

    1、長邊>1524,改用短邊來比較選擇打印紙寬度。

    2、長邊 ≤ 1524,用長邊來比較選擇打印紙寬度。

下面思路就是把要用作比較的邊長放入紙張寬度列表,把列表排序後找到比這個邊長大一點的那個紙張寬度。

主要的步驟就是這些,再經過一頓複製粘貼完善一下其他細節之後,最後會得到一個存放打印信息的列表,把它用txt存起來,這樣後面的PS批量打印需要的信息就全部搞到手了。最後放個gif。

OpenCV Python 系列教程4 – OpenCV 圖像處理(上)

學習目標:

OpenCV 中有 150 多種色彩空間轉化的方法,這裡只討論兩種:

HSV的色相範圍為[0,179],飽和度範圍為[0,255],值範圍為[0,255]。不同的軟件使用不同的規模。如果要比較 OpenCV 值和它們,你需要標準化這些範圍。

HSV 和 HLV 解釋

運行結果:該段程序的作用是檢測藍色目標,同理可以檢測其他顏色的目標

結果中存在一定的噪音,之後的章節將會去掉它

這是物體跟蹤中最簡單的方法。一旦你學會了等高線的函數,你可以做很多事情,比如找到這個物體的質心,用它來跟蹤這個物體,僅僅通過在相機前移動你的手來畫圖表,還有很多其他有趣的事情。

菜鳥教程 在線 HSV- BGR 轉換

比如要找出綠色的 HSV 值,可以使用上面的程序,得到的值取一個上下界。如上面的取下界 [H-10, 100, 100],上界 [H+10, 255, 255]

或者使用其他工具如 GIMP

學習目標:

對圖像進行閾值處理,算是一種最簡單的圖像分割方法,基於圖像與背景之間的灰度差異,此項分割是基於像素級的分割

threshold(src, thresh, maxval, type[, dst]) – retval, dst

計算圖像小區域的閾值。所以我們對同一幅圖像的不同區域得到不同的閾值,這給我們在不同光照下的圖像提供了更好的結果。

三個特殊的輸入參數和一個輸出參數

adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) – dst

opencv-threshold-python

OpenCV 圖片集

本節原文

學習目標:

OpenCV 提供兩種變換函數: cv2.warpAffine 和 cv2.warpPerspective

cv2.resize() 完成縮放

文檔說明

運行結果

說明 : cv2.INTER_LINEAR 方法比 cv2.INTER_CUBIC 還慢,好像與官方文檔說的不一致? 有待驗證。

速度比較: INTER_CUBIC INTER_NEAREST INTER_LINEAR INTER_AREA INTER_LANCZOS4

改變圖像的位置,創建一個 np.float32 類型的變換矩陣,

warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) – dst

運行結果:

旋轉角度( )是通過一個變換矩陣變換的:

OpenCV 提供的是可調旋轉中心的縮放旋轉,這樣你可以在任何你喜歡的位置旋轉。修正後的變換矩陣為

這裡

OpenCV 提供了 cv2.getRotationMatrix2D 控制

cv2.getRotationMatrix2D(center, angle, scale) → retval

運行結果

cv2.getAffineTransform(src, dst) → retval

函數關係:

\begin{bmatrix} x’_i \ y’_i \end{bmatrix}\begin{bmatrix} x’_i \ y’_i \end{bmatrix} =

其中

運行結果:圖上的點便於觀察,兩圖中的紅點是相互對應的

透視變換需要一個 3×3 變換矩陣。轉換之後直線仍然保持筆直,要找到這個變換矩陣,需要輸入圖像上的 4 個點和輸出圖像上的對應點。在這 4 個點中,有 3 個不應該共線。通過 cv2.getPerspectiveTransform 計算得到變換矩陣,得到的矩陣 cv2.warpPerspective 變換得到最終結果。

本節原文

平滑處理(smoothing)也稱模糊處理(bluring),是一種簡單且使用頻率很高的圖像處理方法。平滑處理的用途:常見是用來 減少圖像上的噪點或失真 。在涉及到降低圖像分辨率時,平滑處理是很好用的方法。

圖像濾波:盡量保留圖像細節特徵的條件下對目標圖像的噪聲進行抑制,其處理效果的好壞將直接影響到後續圖像處理和分析的有效性和可靠性。

消除圖像中的噪聲成分叫做圖像的平滑化或濾波操作。信號或圖像的能量大部分集中在幅度譜的低頻和中頻段,在高頻段,有用的信息會被噪聲淹沒。因此一個能降低高頻成分幅度的濾波器就能夠減弱噪聲的影響。

濾波的目的:抽出對象的特徵作為圖像識別的特徵模式;為適應圖像處理的要求,消除圖像數字化時混入的噪聲。

濾波處理的要求:不能損壞圖像的輪廓及邊緣等重要信息;圖像清晰視覺效果好。

平滑濾波是低頻增強的空間濾波技術,目的:模糊和消除噪音。

空間域的平滑濾波一般採用簡單平均法,即求鄰近像元點的平均亮度值。鄰域的大小與平滑的效果直接相關,鄰域越大平滑效果越好,但是鄰域過大,平滑也會使邊緣信息的損失的越大,從而使輸出圖像變得模糊。因此需要選擇合適的鄰域。

濾波器:一個包含加權係數的窗口,利用濾波器平滑處理圖像時,把這個窗口放在圖像上,透過這個窗口來看我們得到的圖像。

線性濾波器:用於剔除輸入信號中不想要的頻率或者從許多頻率中選擇一個想要的頻率。

低通濾波器、高通濾波器、帶通濾波器、帶阻濾波器、全通濾波器、陷波濾波器

boxFilter(src, ddepth, ksize[, dst[, anchor[, normalize[, borderType]]]]) – dst

均值濾波是方框濾波歸一化後的特殊情況。歸一化就是要把處理的量縮放到一個範圍內如 (0,1),以便統一處理和直觀量化。非歸一化的方框濾波用於計算每個像素鄰近內的積分特性,比如密集光流算法中用到的圖像倒數的協方差矩陣。

運行結果:

均值濾波是典型的線性濾波算法,主要方法為鄰域平均法,即用一片圖像區域的各個像素的均值來代替原圖像中的各個像素值。一般需要在圖像上對目標像素給出一個模板(內核),該模板包括了其周圍的臨近像素(比如以目標像素為中心的周圍8(3×3-1)個像素,構成一個濾波模板,即 去掉目標像素本身 )。再用模板中的全體像素的平均值來代替原來像素值。即對待處理的當前像素點(x,y),選擇一個模板,該模板由其近鄰的若干像素組成,求模板中所有像素的均值,再把該均值賦予當前像素點(x,y),作為處理後圖像在該點上的灰度個g(x,y),即個g(x,y)=1/m ∑f(x,y) ,其中m為該模板中包含當前像素在內的像素總個數。

均值濾波本身存在着固有的缺陷,即它不能很好地保護圖像細節,在圖像去噪的同時也破壞了圖像的細節部分,從而使圖像變得模糊,不能很好地去除噪聲點。

cv2.blur(src, ksize[, dst[, anchor[, borderType]]]) → dst

結果:

高斯濾波:線性濾波,可以消除高斯噪聲,廣泛應用於圖像處理的減噪過程。高斯濾波就是對整幅圖像進行加權平均的過程,每一個像素點的值,都由其本身和鄰域內的其他像素值經過 加權平均 後得到。高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描圖像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值。

高斯濾波有用但是效率不高。

高斯模糊技術生成的圖像,其視覺效果就像是經過一個半透明屏幕在觀察圖像,這與鏡頭焦外成像效果散景以及普通照明陰影中的效果都明顯不同。高斯平滑也用於計算機視覺算法中的預先處理階段,以增強圖像在不同比例大小下的圖像效果(參見尺度空間表示以及尺度空間實現)。從數學的角度來看,圖像的高斯模糊過程就是圖像與正態分佈做卷積。由於正態分佈又叫作高斯分佈,所以這項技術就叫作高斯模糊。

高斯濾波器是一類根據高斯函數的形狀來選擇權值的線性平滑濾波器。 高斯平滑濾波器對於抑制服從正態分佈的噪聲非常有效。

一維零均值高斯函數為: 高斯分佈參數 決定了高斯函數的寬度。

高斯噪聲的產生

GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) – dst

線性濾波容易構造,並且易於從頻率響應的角度來進行分析。

許多情況,使用近鄰像素的非線性濾波會得到更好的結果。比如在噪聲是散粒噪聲而不是高斯噪聲,即圖像偶爾會出現很大值的時候,用高斯濾波器進行圖像模糊時,噪聲像素不會被消除,而是轉化為更為柔和但仍然可見的散粒。

中值濾波(Median filter)是一種典型的非線性濾波技術,基本思想是用像素點鄰域灰度值的中值來代替該像素點的灰度值,該方法在去除脈衝噪聲、椒鹽噪聲『椒鹽噪聲又稱脈衝噪聲,它隨機改變一些像素值,是由圖像傳感器,傳輸信道,解碼處理等產生的黑白相間的亮暗點噪聲。椒鹽噪聲往往由圖像切割引起。』的同時又能保留圖像邊緣細節,

中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性信號處理技術,其基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的像素值接近的真實值,從而消除孤立的噪聲點,對於 斑點噪聲(speckle noise)和椒鹽噪聲(salt-and-pepper noise) 來說尤其有用,因為它不依賴於鄰域內那些與典型值差別很大的值。中值濾波器在處理連續圖像窗函數時與線性濾波器的工作方式類似,但濾波過程卻不再是加權運算。

中值濾波在一定的條件下可以克服常見線性濾波器如最小均方濾波、方框濾波器、均值濾波等帶來的圖像細節模糊,而且對濾除脈衝干擾及圖像掃描噪聲非常有效,也常用於保護邊緣信息, 保存邊緣的特性使它在不希望出現邊緣模糊的場合也很有用,是非常經典的平滑噪聲處理方法。

與均值濾波比較:

說明:中值濾波在一定條件下,可以克服線性濾波器(如均值濾波等)所帶來的圖像細節模糊,而且對濾除脈衝干擾即圖像掃描噪聲最為有效。在實際運算過程中並不需要圖像的統計特性,也給計算帶來不少方便。 但是對一些細節多,特別是線、尖頂等細節多的圖像不宜採用中值濾波。

雙邊濾波(Bilateral filter)是一種非線性的濾波方法,是結合 圖像的空間鄰近度和像素值相似度 的一種折衷處理,同時考慮空域信息和灰度相似性,達到保邊去噪的目的。具有簡單、非迭代、局部的特點。

雙邊濾波器的好處是可以做邊緣保存(edge preserving),一般過去用的維納濾波或者高斯濾波去降噪,都會較明顯地模糊邊緣,對於高頻細節的保護效果並不明顯。雙邊濾波器顧名思義比高斯濾波多了一個高斯方差 sigma-d ,它是基於空間分佈的高斯濾波函數,所以在邊緣附近,離的較遠的像素不會太多影響到邊緣上的像素值,這樣就保證了邊緣附近像素值的保存。 但是由於保存了過多的高頻信息,對於彩色圖像里的高頻噪聲,雙邊濾波器不能夠乾淨的濾掉,只能夠對於低頻信息進行較好的濾波。

運行結果

學習目標:

形態變換是基於圖像形狀的一些簡單操作。它通常在二進制圖像上執行。

膨脹與腐蝕實現的功能

侵蝕的基本思想就像土壤侵蝕一樣,它會侵蝕前景物體的邊界(總是試圖保持前景為白色)。那它是做什麼的?內核在圖像中滑動(如在2D卷積中)。只有當內核下的所有像素都是 1 時,原始圖像中的像素( 1 或 0 )才會被視為 1 ,否則它將被侵蝕(變為零)

erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]) – dst

與腐蝕的操作相反。如果內核下的至少一個像素為「1」,則像素元素為「1」。因此它增加了圖像中的白色區域或前景對象的大小增加。通常,在去除噪音的情況下,侵蝕之後是擴張。因為,侵蝕會消除白噪聲,但它也會縮小我們的物體。所以我們擴大它。由於噪音消失了,它們不會再回來,但我們的物體區域會增加。它也可用於連接對象的破碎部分

python:PIL圖像處理

PIL (Python Imaging Library)

Python圖像處理庫,該庫支持多種文件格式,提供強大的圖像處理功能。

PIL中最重要的類是Image類,該類在Image模塊中定義。

從文件加載圖像:

如果成功,這個函數返回一個Image對象。現在你可以使用該對象的屬性來探索文件的內容。

format 屬性指定了圖像文件的格式,如果圖像不是從文件中加載的則為 None 。

size 屬性是一個2個元素的元組,包含圖像寬度和高度(像素)。

mode 屬性定義了像素格式,常用的像素格式為:「L」 (luminance) – 灰度圖, 「RGB」 , 「CMYK」。

如果文件打開失敗, 將拋出IOError異常。

一旦你擁有一個Image類的實例,你就可以用該類定義的方法操作圖像。比如:顯示

( show() 的標準實現不是很有效率,因為它將圖像保存到一個臨時文件,然後調用外部工具(比如系統的默認圖片查看軟件)顯示圖像。該函數將是一個非常方便的調試和測試工具。)

接下來的部分展示了該庫提供的不同功能。

PIL支持多種圖像格式。從磁盤中讀取文件,只需使用 Image 模塊中的 open 函數。不需要提供文件的圖像格式。PIL庫將根據文件內容自動檢測。

如果要保存到文件,使用 Image 模塊中的 save 函數。當保存文件時,文件名很重要,除非指定格式,否則PIL庫將根據文件的擴展名來決定使用哪種格式保存。

** 轉換文件到JPEG **

save 函數的第二個參數可以指定使用的文件格式。如果文件名中使用了一個非標準的擴展名,則必須通過第二個參數來指定文件格式。

** 創建JPEG縮略圖 **

需要注意的是,PIL只有在需要的時候才加載像素數據。當你打開一個文件時,PIL只是讀取文件頭獲得文件格式、圖像模式、圖像大小等屬性,而像素數據只有在需要的時候才會加載。

這意味着打開一個圖像文件是一個非常快的操作,不會受文件大小和壓縮算法類型的影響。

** 獲得圖像信息 **

Image 類提供了某些方法,可以操作圖像的子區域。提取圖像的某個子區域,使用 crop() 函數。

** 複製圖像的子區域 **

定義區域使用一個包含4個元素的元組,(left, upper, right, lower)。坐標原點位於左上角。上面的例子提取的子區域包含300×300個像素。

該區域可以做接下來的處理然後再粘貼回去。

** 處理子區域然後粘貼回去 **

當往回粘貼時,區域的大小必須和參數匹配。另外區域不能超出圖像的邊界。然而原圖像和區域的顏色模式無需匹配。區域會自動轉換。

** 滾動圖像 **

paste() 函數有個可選參數,接受一個掩碼圖像。掩碼中255表示指定位置為不透明,0表示粘貼的圖像完全透明,中間的值表示不同級別的透明度。

PIL允許分別操作多通道圖像的每個通道,比如RGB圖像。 split() 函數創建一個圖像集合,每個圖像包含一個通道。 merge() 函數接受一個顏色模式和一個圖像元組,然後將它們合併為一個新的圖像。接下來的例子交換了一個RGB圖像的三個通道。

** 分離和合併圖像通道 **

對於單通道圖像, split() 函數返回圖像本身。如果想處理各個顏色通道,你可能需要先將圖像轉為RGB模式。

resize() 函數接受一個元組,指定圖像的新大小。

rotate() 函數接受一個角度值,逆時針旋轉。

** 基本幾何變換 **

圖像旋轉90度也可以使用 transpose() 函數。 transpose() 函數也可以水平或垂直翻轉圖像。

** transpose **

transpose() 和 rotate() 函數在性能和結果上沒有區別。

更通用的圖像變換函數為 transform() 。

PIL可以轉換圖像的像素模式。

** 轉換顏色模式 **

PIL庫支持從其他模式轉為「L」或「RGB」模式,其他模式之間轉換,則需要使用一個中間圖像,通常是「RGB」圖像。

ImageFilter 模塊包含多個預定義的圖像增強過濾器用於 filter() 函數。

** 應用過濾器 **

point() 函數用於操作圖像的像素值。該函數通常需要傳入一個函數對象,用於操作圖像的每個像素:

** 應用點操作 **

使用以上技術可以快速地對圖像像素應用任何簡單的表達式。可以結合 point() 函數和 paste 函數修改圖像。

** 處理圖像的各個通道 **

注意用於創建掩碼圖像的語法:

Python計算邏輯表達式採用短路方式,即:如果and運算符左側為false,就不再計算and右側的表達式,而且返回結果是表達式的結果。比如 a and b 如果a為false則返回a,如果a為true則返回b,詳見Python語法。

對於更多高級的圖像增強功能,可以使用 ImageEnhance 模塊中的類。

可以調整圖像對比度、亮度、色彩平衡、銳度等。

** 增強圖像 **

PIL庫包含對圖像序列(動畫格式)的基本支持。支持的序列格式包括 FLI/FLC 、 GIF 和一些實驗性的格式。 TIFF 文件也可以包含多個幀。

當打開一個序列文件時,PIL庫自動加載第一幀。你可以使用 seek() 函數 tell() 函數在不同幀之間移動。

** 讀取序列 **

如例子中展示的,當序列到達結尾時,將拋出EOFError異常。

注意當前版本的庫中多數底層驅動只允許seek到下一幀。如果想回到前面的幀,只能重新打開圖像。

以下迭代器類允許在for語句中循環遍歷序列:

** 一個序列迭代器類 **

PIL庫包含一些函數用於將圖像、文本打印到Postscript打印機。以下是一個簡單的例子。

** 打印到Postscript **

如前所述,可以使用 open() 函數打開圖像文件,通常傳入一個文件名作為參數:

如果打開成功,返回一個Image對象,否則拋出IOError異常。

也可以使用一個file-like object代替文件名(暫可以理解為文件句柄)。該對象必須實現read,seek,tell函數,必須以二進制模式打開。

** 從文件句柄打開圖像 **

如果從字符串數據中讀取圖像,使用StringIO類:

** 從字符串中讀取 **

如果圖像文件內嵌在一個大文件里,比如 tar 文件中。可以使用ContainerIO或TarIO模塊來訪問。

** 從tar文檔中讀取 **

** 該小節不太理解,請參考原文 **

有些解碼器允許當讀取文件時操作圖像。通常用於在創建縮略圖時加速解碼(當速度比質量重要時)和輸出一個灰度圖到激光打印機時。

draft() 函數。

** Reading in draft mode **

輸出類似以下內容:

注意結果圖像可能不會和請求的模式和大小匹配。如果要確保圖像不大於指定的大小,請使用 thumbnail 函數。

Python2.7 教程 PIL

Python 之 使用 PIL 庫做圖像處理

來自

pillow教程

在Python圖像庫中最重要的類是同名模塊中定義的 Image 類。您可以利用以下方法創造該類的實例:從文件中導入圖像、處理其他的圖像以及從零開始創建圖像。

從文件中導入圖像,使用在 Image 模塊中的 open() 函數:

如果成功。該函數返回一個 Image 對象。您現在可以使用實例的屬性來檢查文件內容了:

format 屬性識別圖像的來源。如果圖像不是從圖像中讀取,則該屬性設置為None。 size 屬性是一個一個包含寬和高(像素)的二元組。 mode 屬性定義圖像頻段的數量和名稱,以及像素的類型和深度。常用的模式(mode)為表示灰色圖像的「L」,表示真彩色圖像的處理問題「RGB」,以及印前圖像的畫面「CMYK」。

如何圖像不能被打開,則會報出 OSError 異常。

一旦您有 Image 類的實例,您可以使用類中定義的方法來處理和操作圖像。比如,讓我們顯示導入的圖像:

show() 的標準版本不是非常的高效,因為該函數會把圖像保存到一個臨時文件並調用實用程序來顯示圖像。如果您沒有安裝一個合適的實用程序,它甚至不會起作用。雖然當它不起作用時,調試和測試是非常方便的。

下面的章節概括了該庫提供的不同函數。

該Python圖像庫支持大量的圖像文件格式。為了從磁盤中閱讀文件,使用在 Image 模塊中的 open() 。您不需要知道打開文件的文件格式。該庫能夠自動地根據文件的內容決定格式。

為了保存一個文件,使用 Image 類中的 save() 方法。當保存文件時,名字非常重要。除非您指定格式,該庫使用文件名的後綴來發現將要使用的文件存儲格式。

提供給 save() 方法的第二個參數精準地制定了一個文件的格式。如果您使用了非標準的後綴,您必須一直使用以下方式指定格式:

值得注意的是,非必要情況該庫不會解碼或加載柵格數據(raster data)。當您打開一個文件時,文件頭將被讀取用於確定文件格式以及提取如模式、尺寸等其他解碼文件需要的性質,但是文件餘下的部分會稍後再處理。

這意味着打開一個圖像是最後的操作,它與文件大小和壓縮類型無關。這裡有一種簡單的腳本可以塊度地識別圖像文件集:

Image類包含允許您操作圖像內區域的方法。為了從圖像中提取子矩形,使用crop()方法。

一個區域是一個4元組,其中坐標為(左,上,右,下)。該Python圖像庫使用左上角坐標為(0,0)的坐標系統。同樣值得注意的是,坐標是指像素間的位置,因此上例中的區域正好為300×300的像素。

該區域現在能以某種方法進行處理並粘貼回去。

當將區域粘貼回去時,區域的大小必須準確地匹配給定的區域。此外,區域不能拓展到圖像之外。然而,原始圖像和區域的模式不必相匹。如果相同,則區域會在被粘貼前自動地轉換(有關詳細信息,請參閱下面的 顏色轉換 部分)。

這裡有一個額外的例子:

對於更高級的技巧,paste方法可以將透明掩碼(transparency mask)作為可選參數。在掩碼中,數值255被粘貼的圖像在該位置是不透明的(即,被粘貼的圖像就是原圖粘貼)。數值0表示被粘貼的圖像是完全透明的。在0和255之間的數值表示不同級別的透明程度。例如,粘貼一個RGBA圖像並將其作為掩碼會粘貼圖像的不透明部分,但不會粘貼其透明背景。

該Python圖像庫也允許您在多頻段圖像中的單個頻段中進行工作,例如RGB圖像。split方法創造了新的圖像集,每一個都包含了來自原始多頻段圖像的一個頻段。合併函數將一個模式和圖像組作為輸入,並將其組合為新圖像。下面示例交換了一個RGB圖像的三個頻段:

值得注意的是,對一個單波段圖像而言, split() 返回圖像本身。要在單個顏色頻段上工作,您可能需要首先將圖像轉換為”RGB”。

PIL.Image.Image 類包含調整( resize() )和旋轉( rotate() )一個圖像的方法。前者通過輸入元組來確定新的圖片大小,後者通過輸入的角度以逆時間旋轉圖片。

若要90度旋轉圖像,您即可以使用 rotate() 方法,也可以使用 transpose() 方法。後者還可以在水平或垂直軸周圍翻轉圖像。

transpose(ROTATE)也可以和 rotate() 執行的結果相同,前提是rotate()中的expand標誌設置為真,用以提供圖像尺寸的相同更改。

圖像轉換的一種更一般的形式是通過 transform() 方法執行。

該Python圖像庫允許您使用convert()方法在不同的像素表示間轉換圖像。

該庫可以在每個支持的模式和「L」以及「RGB」模式間進行轉換。為了在其他模式間進行轉換,您可能會使用到一個中間圖像(通常為「RGB」圖像)。

該Python圖像庫提供了大量的方法和模塊用於增強圖像。

ImageFilter 模塊包含了許多能和 filter() 方法一起使用的預定義的增強過濾器。

point() 方法用於翻譯圖像的像素值(如圖像對比度操作)。在多數情況下,一個函數對象期望一個傳遞給方法的參數。每一個像素都按照函數進行處理:

使用以上方法,您可以快速地在圖像上應用任何簡單的表達式。您還可以通過結合 point() 和 paste() 方法來有選擇性地修改圖像:

以下語法用於創造掩碼:

Python僅評估確定結果所需的邏輯表達部分,並返回作為表達結果檢查的最後值。因此,如果以上表達式為假(0),Python不再查看第二個操作數,並返回0。相反地,返回255。

對更先進的圖像增強,您可以使用 ImageEnhance 模塊中的類。一旦從圖像創建,增強對象可用於快速嘗試不同的設置。

您可以通過這種方式調整對比度、亮度、顏色平衡和銳度。

該Python圖像庫包含一些對圖像序列(也稱為動畫支持)的基礎支持。支持的序列格式包括FLI/FLC,GIF,以及一些實驗格式。TIgFF文件還可以包含多個幀。

當您打開一個序列文件,PIL自動地導入序列的第一幀。您可以使用seek並告訴方法在不同幀之間移動:

如例所見,當序列結束時,您會得到一個 EOFError 異常。

下列類允許您使用for語句循環序列:

該Python圖像庫包含在PostScript打印機上打印圖像、文本以及圖形的功能。下面是一個簡單的示例:

如早前描述的一樣, Image 模塊中的 open() 函數用於打開圖像文件。在大部分情況下,您簡單地傳入文件名作為一個參數。Image.open能作為文本管理器:

您可以使用一個類文件對象來代替文件名。這個對戲必須實現必須實現file.read、file.seek和file.tell方法,且必須以二進制模式打開。

要從二進制數據中讀取圖像,請使用 Bytes10 類:

請注意,庫在閱讀圖像頭部之前會倒帶文件(使用seek(0))。此外,當讀取圖像數據時(通過load方法),還將使用seek。如果圖像文件嵌入到較大的文件中,例如tar文件,您可以使用 ContainerIO 或 TarIO 模塊來訪問它。

一些解碼器允許您在從文件中讀取圖像時對其進行操作。這通常被用於創建縮略圖(當速度遠大於質量時)和打印到單色激光打印機(當只需要圖像的灰度版本時)的解碼過程。

draft()方法操縱打開但尚未加載的圖像,以便儘可能與給定的模式和大小匹配。這是通過重新配置圖像解碼器來完成的。

這隻適用於JPEG和MPO文件。

打印結果如下:

值得注意的是,生成的圖像可能不會精確地匹配要求的模式和尺寸。為了確保圖像不大於給定的尺寸,請使用thumbnail方法。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/246254.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-12 13:14
下一篇 2024-12-12 13:14

相關推薦

  • Python中引入上一級目錄中函數

    Python中經常需要調用其他文件夾中的模塊或函數,其中一個常見的操作是引入上一級目錄中的函數。在此,我們將從多個角度詳細解釋如何在Python中引入上一級目錄的函數。 一、加入環…

    編程 2025-04-29
  • 如何查看Anaconda中Python路徑

    對Anaconda中Python路徑即conda環境的查看進行詳細的闡述。 一、使用命令行查看 1、在Windows系統中,可以使用命令提示符(cmd)或者Anaconda Pro…

    編程 2025-04-29
  • Python列表中負數的個數

    Python列表是一個有序的集合,可以存儲多個不同類型的元素。而負數是指小於0的整數。在Python列表中,我們想要找到負數的個數,可以通過以下幾個方面進行實現。 一、使用循環遍歷…

    編程 2025-04-29
  • Python計算陽曆日期對應周幾

    本文介紹如何通過Python計算任意陽曆日期對應周幾。 一、獲取日期 獲取日期可以通過Python內置的模塊datetime實現,示例代碼如下: from datetime imp…

    編程 2025-04-29
  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • 蝴蝶優化算法Python版

    蝴蝶優化算法是一種基於仿生學的優化算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化算法Python版…

    編程 2025-04-29
  • Python字典去重複工具

    使用Python語言編寫字典去重複工具,可幫助用戶快速去重複。 一、字典去重複工具的需求 在使用Python編寫程序時,我們經常需要處理數據文件,其中包含了大量的重複數據。為了方便…

    編程 2025-04-29
  • Python清華鏡像下載

    Python清華鏡像是一個高質量的Python開發資源鏡像站,提供了Python及其相關的開發工具、框架和文檔的下載服務。本文將從以下幾個方面對Python清華鏡像下載進行詳細的闡…

    編程 2025-04-29
  • Python程序需要編譯才能執行

    Python 被廣泛應用於數據分析、人工智能、科學計算等領域,它的靈活性和簡單易學的性質使得越來越多的人喜歡使用 Python 進行編程。然而,在 Python 中程序執行的方式不…

    編程 2025-04-29
  • python強行終止程序快捷鍵

    本文將從多個方面對python強行終止程序快捷鍵進行詳細闡述,並提供相應代碼示例。 一、Ctrl+C快捷鍵 Ctrl+C快捷鍵是在終端中經常用來強行終止運行的程序。當你在終端中運行…

    編程 2025-04-29

發表回復

登錄後才能評論