當前位置:首頁 » 編程語言 » pythonimread

pythonimread

發布時間: 2022-06-15 21:30:04

㈠ 如何採用python讀取一個圖像

  • 打開winPython工具包

  • 輸入以下代碼,如圖所示。

    from skimage import io

    if __name__ == '__main__':

    img_name="D:\WinPython-64bit-3.5.3.0Qt5\notebooks\hashiqi.jpg"

    print("我的圖片!")

    img=io.imread(img_name,as_grey=False)

    io.imshow(img)

    其中變數img_name是為了指定自己圖片所存的路徑。

  • 單擊保存按鈕,

    會跳出一個設置文件名的界面,填入要保存的名字即可。

  • 單擊運行按鈕,一般要單擊兩次才行,運行代碼。

  • 單擊後,就可以查看的我們顯示的圖片了。

㈡ 怎麼用python顯示一張圖片

用python顯示一張圖片方法如下:

import matplotlib.pyplot as plt # plt 用於顯示圖片

import matplotlib.image as mpimg # mpimg 用於讀取圖片

import numpy as nplena = mpimg.imread('lena.png') # 讀取和代碼處於同一目錄下的 lena.png# 此時 lena 就已經是一個 np.array 了,可以對它進行任意處理

lena.shape #(512, 512, 3)plt.imshow(lena) # 顯示圖片plt.axis('off') # 不顯示坐標軸

plt.show()

㈢ python io. imread如何設置參數,使讀取的圖片為灰度圖

方法一:在使用OpenCV讀取圖片的同時將圖片轉換為灰度圖:

img = cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE)
print("cv2.imread(imgfile, cv2.IMREAD_GRAYSCALE)結果如下:")
print('大小:{}'.format(img.shape))
print("類型:%s"%type(img))
print(img)
運行結果如下圖所示:

方法二:使用OpenCV,先讀取圖片,然後在轉換為灰度圖:

img = cv2.imread(imgfile)
#print(img.shape)
#print(img)
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #Y = 0.299R + 0.587G + 0.114B
print("cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)結果如下:")
print('大小:{}'.format(gray_img.shape))
print("類型:%s" % type(gray_img))
print(gray_img)
運行結果如下:

方法三:使用PIL庫中的Image模塊:

img = np.array(Image.open(imgfile).convert('L'), 'f') #讀取圖片,灰度化,轉換為數組,L = 0.299R + 0.587G + 0.114B。'f'為float類型
print("Image方法的結果如下:")
print('大小:{}'.format(img.shape))
print("類型:%s" % type(img))
print(img)

㈣ python對衛星地圖tif文件轉換

pathjoin那裡錯了。應該是:

圖一中的錯誤表明,imread返回值img是None
imread的第一個參數,即使傳入的是一個無效的文件名,它也不會拋出錯誤,而是返回一個None.

第一個參數的賦值是this.dir = os.path.join(dir + ...)
這種寫法並不好,一般來說,應該是寫成
this.dir = os.path.join(dir , filename)
並且,你應當在這之後檢查一下這個文件是否存在:
if not os.path.isfile(this.dir):
....raise FileNotFoundError(this.dir)
然後才可以交給imread()去讀取

㈤ python plt.imshow 怎麼用

用法以既步驟:

1、給出一張圖片。

㈥ 如何在python中從調用cv2.imread()後得到的圖片中截取一塊矩形部分

1、首先導入os模塊。os模塊直接和操作系統聯系。

㈦ python處理圖片數據

目錄

1.機器是如何存儲圖像的?

2.在Python中讀取圖像數據

3.從圖像數據中提取特徵的方法#1:灰度像素值特徵

4.從圖像數據中提取特徵的方法#2:通道的平均像素值

5.從圖像數據中提取特徵的方法#3:提取邊緣
是一張數字8的圖像,仔細觀察就會發現,圖像是由小方格組成的。這些小方格被稱為像素。

但是要注意,人們是以視覺的形式觀察圖像的,可以輕松區分邊緣和顏色,從而識別圖片中的內容。然而機器很難做到這一點,它們以數字的形式存儲圖像。請看下圖:

機器以數字矩陣的形式儲存圖像,矩陣大小取決於任意給定圖像的像素數。

假設圖像的尺寸為180 x 200或n x m,這些尺寸基本上是圖像中的像素數(高x寬)。

這些數字或像素值表示像素的強度或亮度,較小的數字(接近0)表示黑色,較大的數字(接近255)表示白色。通過分析下面的圖像,讀者就會弄懂到目前為止所學到的知識。

下圖的尺寸為22 x 16,讀者可以通過計算像素數來驗證:

圖片源於機器學習應用課程

剛才討論的例子是黑白圖像,如果是生活中更為普遍的彩色呢?你是否認為彩色圖像也以2D矩陣的形式存儲?

彩色圖像通常由多種顏色組成,幾乎所有顏色都可以從三原色(紅色,綠色和藍色)生成。

因此,如果是彩色圖像,則要用到三個矩陣(或通道)——紅、綠、藍。每個矩陣值介於0到255之間,表示該像素的顏色強度。觀察下圖來理解這個概念:

圖片源於機器學習應用課程

左邊有一幅彩色圖像(人類可以看到),而在右邊,紅綠藍三個顏色通道對應三個矩陣,疊加三個通道以形成彩色圖像。

請注意,由於原始矩陣非常大且可視化難度較高,因此這些不是給定圖像的原始像素值。此外,還可以用各種其他的格式來存儲圖像,RGB是最受歡迎的,所以筆者放到這里。讀者可以在此處閱讀更多關於其他流行格式的信息。

用Python讀取圖像數據

下面開始將理論知識付諸實踐。啟動Python並載入圖像以觀察矩陣:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
from skimage.io import imread, imshow
image = imread('image_8_original.png', as_gray=True)
imshow(image)

#checking image shape
image.shape, image

(28,28)

矩陣有784個值,而且這只是整個矩陣的一小部分。用一個LIVE編碼窗口,不用離開本文就可以運行上述所有代碼並查看結果。

下面來深入探討本文背後的核心思想,並探索使用像素值作為特徵的各種方法。

方法#1:灰度像素值特徵

從圖像創建特徵最簡單的方法就是將原始的像素用作單獨的特徵。

考慮相同的示例,就是上面那張圖(數字『8』),圖像尺寸為28×28。

能猜出這張圖片的特徵數量嗎?答案是與像素數相同!也就是有784個。

那麼問題來了,如何安排這784個像素作為特徵呢?這樣,可以簡單地依次追加每個像素值從而生成特徵向量。如下圖所示:

下面來用Python繪制圖像,並為該圖像創建這些特徵:

image = imread('puppy.jpeg', as_gray=True)

image.shape, imshow(image)

(650,450)

該圖像尺寸為650×450,因此特徵數量應為297,000。可以使用NumPy中的reshape函數生成,在其中指定圖像尺寸:

#pixel features

features = np.reshape(image, (660*450))

features.shape, features

(297000,)
array([0.96470588, 0.96470588, 0.96470588, ..., 0.96862745, 0.96470588,
0.96470588])

這里就得到了特徵——長度為297,000的一維數組。很簡單吧?在實時編碼窗口中嘗試使用此方法提取特徵。

但結果只有一個通道或灰度圖像,對於彩色圖像是否也可以這樣呢?來看看吧!

方法#2:通道的平均像素值

在讀取上一節中的圖像時,設置了參數『as_gray = True』,因此在圖像中只有一個通道,可以輕松附加像素值。下面刪除參數並再次載入圖像:

image = imread('puppy.jpeg')
image.shape

(660, 450, 3)

這次,圖像尺寸為(660,450,3),其中3為通道數量。可以像之前一樣繼續創建特徵,此時特徵數量將是660*450*3 = 891,000。

或者,可以使用另一種方法:

生成一個新矩陣,這個矩陣具有來自三個通道的像素平均值,而不是分別使用三個通道中的像素值。

下圖可以讓讀者更清楚地了解這一思路:

這樣一來,特徵數量保持不變,並且還能考慮來自圖像全部三個通道的像素值。

image = imread('puppy.jpeg')
feature_matrix = np.zeros((660,450))
feature_matrix.shape

(660, 450)

現有一個尺寸為(660×450×3)的三維矩陣,其中660為高度,450為寬度,3是通道數。為獲取平均像素值,要使用for循環:

for i in range(0,iimage.shape[0]):
for j in range(0,image.shape[1]):
feature_matrix[i][j] = ((int(image[i,j,0]) + int(image[i,j,1]) + int(image[i,j,2]))/3)

新矩陣具有相同的高度和寬度,但只有一個通道。現在,可以按照與上一節相同的步驟進行操作。依次附加像素值以獲得一維數組:

features = np.reshape(feature_matrix, (660*450))
features.shape

(297000,)

方法#3:提取邊緣特徵

請思考,在下圖中,如何識別其中存在的對象:

識別出圖中的對象很容易——狗、汽車、還有貓,那麼在區分的時候要考慮哪些特徵呢?形狀是一個重要因素,其次是顏色,或者大小。如果機器也能像這樣識別形狀會怎麼樣?

類似的想法是提取邊緣作為特徵並將其作為模型的輸入。稍微考慮一下,要如何識別圖像中的邊緣呢?邊緣一般都是顏色急劇變化的地方,請看下圖:

筆者在這里突出了兩個邊緣。這兩處邊緣之所以可以被識別是因為在圖中,可以分別看到顏色從白色變為棕色,或者由棕色變為黑色。如你所知,圖像以數字的形式表示,因此就要尋找哪些像素值發生了劇烈變化。

假設圖像矩陣如下:

圖片源於機器學習應用課程

該像素兩側的像素值差異很大,於是可以得出結論,該像素處存在顯著的轉變,因此其為邊緣。現在問題又來了,是否一定要手動執行此步驟?

當然不!有各種可用於突出顯示圖像邊緣的內核,剛才討論的方法也可以使用Prewitt內核(在x方向上)來實現。以下是Prewitt內核:

獲取所選像素周圍的值,並將其與所選內核(Prewitt內核)相乘,然後可以添加結果值以獲得最終值。由於±1已經分別存在於兩列之中,因此添加這些值就相當於獲取差異。

還有其他各種內核,下面是四種最常用的內核:

圖片源於機器學習應用課程

現在回到筆記本,為同一圖像生成邊緣特徵:

#importing the required libraries
import numpy as np
from skimage.io import imread, imshow
from skimage.filters import prewitt_h,prewitt_v
import matplotlib.pyplot as plt
%matplotlib inline

#reading the image
image = imread('puppy.jpeg',as_gray=True)

#calculating horizontal edges using prewitt kernel
edges_prewitt_horizontal = prewitt_h(image)
#calculating vertical edges using prewitt kernel
edges_prewitt_vertical = prewitt_v(image)

imshow(edges_prewitt_vertical, cmap='gray')

㈧ Python的各種imread函數在實現方式和讀取速度上有何區別

1. PIL.Image.open

代碼在這里:Pillow/Image.py at 3.1.x · python-pillow/Pillow · GitHub
open() 函數打開圖像,但並不讀入,直到有操作發生。
具體的讀取操作是在 ImageFile.py 寫的。大體流程是先檢測文件類型,整塊地讀入文件內容,然後調用解碼器解碼,做了很多優化,效率應該還是很高的。

2. scipy.ndimage.imread

代碼在這里:scipy/io.py at v0.17.1 · scipy/scipy · GitHub
imread 調用 scipy.misc.pilutil.imread。從名字就能看出來其實調用的還是 Pillow。
根據 pilutil 代碼:scipy/pilutil.py at v0.17.1 · scipy/scipy · GitHub
確實是調用 pil.image.open(),然後返回一個 fromimage()。

3. scipy.misc.imread

misc 的 __init__.py 在這里:scipy/__init__.py at v0.17.1 · scipy/scipy · GitHub
調用的還是 pilutil 中的 imread
相關代碼如下
try:
from .pilutil import *
from . import pilutil
__all__ += pilutil.__all__
del pilutil
except ImportError:
pass

也算是學了一招,從 pilutil 導入其所有函數添加到當前空間,然後又刪除了 pilutil 消除影響。

4. skimage.io.imread

代碼在這里:scikit-image/_io.py at master · scikit-image/scikit-image · GitHub
是通過插件 plugin 來讀入不同的文件,而且會試用幾個不同的 plugins 來找到合適的。
使用 call_plugin 來調用,代碼在這里:scikit-image/manage_plugins.py at master · scikit-image/scikit-image · GitHub
可以根據如下代碼查看插件調用的優先順序
# For each plugin type, default to the first available plugin as defined by
# the following preferences.
preferred_plugins = {
# Default plugins for all types (overridden by specific types below).
'all': ['pil', 'matplotlib', 'qt', 'freeimage'],
'imshow': ['matplotlib'],
'imshow_collection': ['matplotlib']
}

plugins 的源代碼在這里:scikit-image/skimage/io/_plugins at master · scikit-image/scikit-image · GitHub。可以看到 pil 的 imread,是用 open 打開圖像之後,再轉換成 ndarray。

5. cv2.imread

這里是調用的 CV::imread(),代碼在這里:opencv/loadsave.cpp at master · opencv/opencv · GitHub。一般來說 C\C++ 的實現,應該比 python 速度快一點。

6. matplotlib.image.imread

matplotlib 的文檔裡面說,matplotlib 原生只可以讀取 PNG 文件,有 PIL 的時候,可以讀取其他類型的文件。如果使用 URL 打開在線圖像文件,需要符合 PIL 的文檔要求。

matplotlib.image.imread 的代碼在這里:matplotlib/image.py at master · matplotlib/matplotlib · GitHub。matplotlib 的原生 PNG 讀取和寫入,是用 C 實現的,代碼在這里:matplotlib/_png.cpp at master · matplotlib/matplotlib · GitHub。

matplotlib 是先用 pil 的 open 打開圖像,如果格式是 png,就用原生方法打開。相關代碼如下:
handlers = {'png': _png.read_png, }
if format is None:
if cbook.is_string_like(fname):
parsed = urlparse(fname)
# If the string is a URL, assume png
if len(parsed.scheme) > 1:
ext = 'png'
else:
basename, ext = os.path.splitext(fname)
ext = ext.lower()[1:]
elif hasattr(fname, 'name'):
basename, ext = os.path.splitext(fname.name)
ext = ext.lower()[1:]
else:
ext = 'png'
else:
ext = format

if ext not in handlers:
im = pilread(fname)
if im is None:
raise ValueError('Only know how to handle extensions: %s; '
'with Pillow installed matplotlib can handle '
'more images' % list(six.iterkeys(handlers)))
return im

聲明的處理器只有 png。如果是 png 文件,調用 _png.read_png。如果不是 png 直接使用 pilread(就是用 pil 的 Image.open 然後 pil_to_array)。

matplotlib 的源碼確實比較復雜,一大部分主體是用 C 寫的,改動很激進,功能更新猛烈。

熱點內容
androidurl獲取圖片 發布:2025-02-07 02:22:11 瀏覽:482
調用上傳 發布:2025-02-07 02:19:53 瀏覽:84
aix編譯安裝 發布:2025-02-07 02:19:52 瀏覽:906
android界面設計尺寸 發布:2025-02-07 02:16:25 瀏覽:898
zenly安卓為什麼會一直閃 發布:2025-02-07 02:12:02 瀏覽:357
為什麼安卓手機界面總出廣告 發布:2025-02-07 02:10:33 瀏覽:243
plc數據塊怎麼編譯 發布:2025-02-07 02:09:44 瀏覽:98
ct加密 發布:2025-02-07 02:09:03 瀏覽:919
編程差別 發布:2025-02-07 02:06:37 瀏覽:348
pythonmysqlmac安裝 發布:2025-02-07 01:56:36 瀏覽:403