日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > ChatGpt >内容正文

ChatGpt

【AI基础】OpenCV,PIL,Skimage你pick谁

發(fā)布時間:2025/3/20 ChatGpt 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【AI基础】OpenCV,PIL,Skimage你pick谁 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章首發(fā)于微信公眾號《與有三學(xué)AI》

【AI基礎(chǔ)】OpenCV,PIL,Skimage你pick誰

如何對圖像進(jìn)行處理是深度學(xué)習(xí)圖像處理的基礎(chǔ),我們常常需要對圖像進(jìn)行讀取、保存、縮放、裁剪、旋轉(zhuǎn)、顏色轉(zhuǎn)換等基本操作。

本文將講解如何利用opencv、PIL、?scikit-image等進(jìn)行圖像處理,并比較它們之間微小的差異。

?

01?三大包的基礎(chǔ)操作

本節(jié)講解如何利用opencv、PIL、?scikit-image等工具進(jìn)行圖像讀取、圖像保存、圖像縮放、裁剪、旋轉(zhuǎn)、顏色轉(zhuǎn)換等基本操作。

下面將基于下面這張圖片演示如何對圖形進(jìn)行基本的處理

1.1 利用PIL處理圖像? ? ? ? ? ? ? ? ? ? ? ? ? ??

我們首先從讀取圖片開始,很多圖像處理庫(如opencv、skimage)都以imread()讀取圖片,但是PIL用open方法。

?如果我們想要使用PIL來處理圖像,必須先導(dǎo)入Image模塊,這是進(jìn)行一切操作的前提。導(dǎo)入方法如下:

from PIL import Image

讀取一幅圖像

#我的圖片是保存在d盤picture文件夾下

img = Image.open('d:/picture/cat.jpg')

執(zhí)行上述代碼返回的結(jié)果如下:

怎樣才能可視化這個圖像呢?

我們需要調(diào)用matplotlib這個庫,如果沒有matplotlib.pyplot中的show()方法,圖像只會在內(nèi)存中,我們當(dāng)然看不見了。話不多說,代碼如下

from PIL import Image

import matplotlib.pyplot as plt

img = Image.open('d:/picture/cat.jpg')

plt.imshow(img)
plt.show()

結(jié)果如下:

查看圖片信息

哈哈!圖片我們已經(jīng)看到了,這是萬里長征的第一步。如果我們想要了解圖片格式,大小應(yīng)該怎么辦呢?方法如下:

print(img.format)#查看圖片格式

print(img.size)#查看圖片大小

print(img.mode)#查看圖片模式

我只列舉了常用的三個其實還有很多,可以自行搜索

更改圖像形式

使用PIL中的crop()方法可以從一幅圖像中裁剪指定區(qū)域,該區(qū)域使用四元組來指定,四元組的的坐標(biāo)依次是(b1,a1,b2,a2),通常一張圖片的左上角為0。示意圖如下:

?

如何對圖像進(jìn)行裁剪,具體代碼如下:

裁剪后的圖片

調(diào)整圖片尺寸和旋轉(zhuǎn)

我們可以使用resize()來調(diào)整圖片尺寸,該方法的參數(shù)是一個元組,用來指定圖像的大小,代碼如下:

#把圖片的尺寸改為400x400,tuple里面是圖像的weight和height

Img2 = img1.resize((400,400))

調(diào)整大小后的圖片

要旋轉(zhuǎn)一幅圖像,可以使用逆時針方法表示角度,調(diào)用rotate()方法,代碼如下:

img2 = img1.rotate((45))

旋轉(zhuǎn)后的圖片

對圖像旋轉(zhuǎn)(旋轉(zhuǎn)90度的整數(shù)倍)和翻轉(zhuǎn)也可以用transpose,方法如下:

#左右對換。

img2=img1.transpose(Image.FLIP_LEFT_RIGHT)?

#上下對換。

img2=img1.transpose(Image.FLIP_TOP_BOTTOM)??

#旋轉(zhuǎn) 90 度角。注意只能旋轉(zhuǎn)90度的整數(shù)倍

img2=img1.transpose(Image.ROTATE_90)??

左右翻轉(zhuǎn)

上下翻轉(zhuǎn)

圖像顏色變化

PIL中可以使用convet()方法來實現(xiàn)圖像一些顏色的變化,convert()函數(shù)會根據(jù)傳入?yún)?shù)的不同將圖片變成不同的模式。在PIL中有9種模式,如下表所示:

下面我們以灰度圖像為例,將目標(biāo)圖像轉(zhuǎn)換成灰度圖像,方法如下:

img1 = img.convert('F')#將圖片轉(zhuǎn)化為32位浮點(diǎn)灰色圖像,結(jié)果如下圖:

下面再使用skimage和opencv對圖像進(jìn)行基本操作,只附上具體實現(xiàn)代碼和注釋,效果和上面的其實沒什么差別。

1.2 使用skimage對圖像處理? ? ? ? ? ? ? ? ??

#導(dǎo)入io模塊

from skimage import io

#以彩色模式讀取圖片

img=io.imread('d:/picture/cat.jpg')

#以灰色圖像模式讀取圖片

img=io.imread('d:/picture/cat.jpg',as_grey=True)

#將圖片保存在c盤,picture文件夾下

io.imsave('c:/picture/cat.jpg')

#將圖片的大小變?yōu)?00x500

img1 = transform.resize(img, (500,500))

#縮小為原來圖片大小的0.1

img2 = transform.rescale(img, 0.1)?

#縮小為原來圖片行數(shù)一半,列數(shù)四分之一

img3 = transform.rescale(img, [0.5,0.25])

#放大為原來圖片大小的2倍

img4 =transform.rescale(img, 2)

#旋轉(zhuǎn)60度,不改變大小

img5 =transform.rotate(img, 60)

#旋轉(zhuǎn)60度,同時改變大小

img6=transform.rotate(img, 60,resize=True)?

#將圖片調(diào)暗,。如果gamma大于1,新圖像比原圖像暗,如果gamma<1,新圖像比原圖像亮

img7= exposure.adjust_gamma(img, 4)?

#將圖片調(diào)亮

img8= exposure.adjust_gamma(img, 0.3)

1.3使用opencv對圖像進(jìn)行處理?

#導(dǎo)入opencv

import cv2

#讀取圖片返回的是numpy.array格式

#cv2.imread共兩個參數(shù),第一個參數(shù)為要讀入的圖片文件名,第二個參數(shù)為如何讀取圖片,包括cv2.IMREAD_COLOR:讀入一副彩色圖片;cv2.IMREAD_GRAYSCALE:以灰度模式讀入圖片;cv2.IMREAD_UNCHANGED:讀入一幅圖片,并包括其alpha通道。

img = cv2.imread('d:/picture/cat.jpg')

#獲取圖片屬性

print(img.shape)#返回圖片的長,寬和通道數(shù)

#保存圖片,共兩個參數(shù),第一個為保存文件名,第二個為讀入圖片

cv2.imwrite('c:/picture/cat4.jpg',img)

#創(chuàng)建一個窗口顯示圖片,共兩個參數(shù),第一個參數(shù)表示窗口名字,可以創(chuàng)建多個窗口中,但是每個窗口不能重名;第二個參數(shù)是讀入的圖片。

cv2.imshow()

#鍵盤綁定函數(shù),共一個參數(shù),表示等待毫秒數(shù),將等待特定的幾毫秒,看鍵盤是否有輸入,返回值為ASCII值。如果其參數(shù)為0,則表示無限期的等待鍵盤輸入

cv2.waitKey()

#刪除建立的全部窗口

cv2.destroyAllWindows()

刪除指定的窗口

cv2.destroyWindows()

#opencv中圖像彩色空間變換函數(shù)cv2.cvtColor

cv2.cvtColor(input_image,fiag)

參數(shù)一: input_image表示將要變換色彩的圖像ndarray對象?
參數(shù)二: 表示圖像色彩空間變換的類型,以下介紹常用的兩種:?
·?cv2.COLOR_BGR2GRAY:?表示將圖像從BGR空間轉(zhuǎn)化成灰度圖,最常用?
·?cv2.COLOR_BGR2HSV:?表示將圖像從RGB空間轉(zhuǎn)換到HSV空間?
如果想查看參數(shù)flag的全部類型,請執(zhí)行以下程序便可查閱,總共有274種空間轉(zhuǎn)換類型:

import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)

?

02?比較細(xì)節(jié)差異

2.1讀取方式上的不同

我們首先從讀取圖片開始,PIL用open方法來讀取圖片,但opencv、skimage都以imread()讀取圖片。

2.2讀進(jìn)來內(nèi)容的差異

opencv讀進(jìn)來的圖片已經(jīng)是一個numpy矩陣了,彩色圖片維度是(高度,寬度,通道數(shù))。數(shù)據(jù)類型是uint8;

opencv對于讀進(jìn)來的圖片的通道排列是BGR,而不是主流的RGB!謹(jǐn)記!

opencV存儲的格式:BGR

PIL讀進(jìn)來的圖像是一個對象,而不是我們所熟知的numpy 矩陣

PIL儲存的格式

針對PIL讀進(jìn)來的圖像是一個對象,那么如何才能將讀進(jìn)來的圖片轉(zhuǎn)為矩陣呢,方法如下:

from PIL import Image
import numpy as np
img1 = Image.open('d:/picture/cat.jpg')
arr = np.array(img1)

轉(zhuǎn)換后的格式

skimage讀取一張圖像時也是以numpy array形式讀入skimage的存儲格式是RGB。如下圖所示:

skimage的存儲格式RGB

skimage有一個巨大的不同是讀取灰度圖時其圖像的矩陣的值被歸一化了,注意注意!

我們skimage先看讀取灰度圖的方式,代碼如下:

from skimage import io
img=io.imread('d:/picture/cat.jpg',as_grey=True)

讀取的結(jié)果如下圖所示,明顯看到被歸一化了!

我們再看opencv和PIL讀取灰度圖時會不會被歸一化呢?代碼和對比如下:

opencv讀取灰度圖

import cv2
img=cv2.imread('d:/picture/cat.jpg',cv2.IMREAD_GRAYSCALE)

opencv讀取灰度圖格式

PIL讀取灰度圖

from PIL import Image
import numpy as np
img1 = Image.open('d:/picture/cat.jpg').convert('L')
arr = np.array(img1)

PIL讀取灰度圖格式

從上面的對比可以看出skimage讀取灰度圖時的巨大不同就是其圖像的矩陣的值被歸一化了!!!

?

03?總結(jié)

總的來說OpenCV、Skimage、PIL各有千秋。各種框架中進(jìn)行進(jìn)行混用,所以我們都必須要掌握,而且要注意區(qū)分他們之間微小的差異。

感謝各位看官的耐心閱讀,不足之處希望多多指教。后續(xù)內(nèi)容將會不定期奉上,歡迎大家關(guān)注有三公眾號 有三AI

?

總結(jié)

以上是生活随笔為你收集整理的【AI基础】OpenCV,PIL,Skimage你pick谁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。