『壹』 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 寫的,改動很激進,功能更新猛烈。
『貳』 Python 3.6 + opencv 3.4 中imshow 函數報錯
看報錯信息,應該是你的img圖像數據載入錯誤導致img數據的width和height等於0,導致窗口顯示失敗。在使用imread函數載入圖像文件之後一定要通過img.empty()判斷一下文件載入是否正確,否則後面所有基於img做的操作都會報錯。
『叄』 python plt.imshow 怎麼用
用法以既步驟:
1、給出一張圖片。
『肆』 c#的窗口如何顯示python imshow函數的結果
1、把python里的imshow函數的結果,發消息到電腦系統消息裡面去,註:消息ID 唯一
2、C#窗口重寫接收系統消息函數,收到消息後,判斷 消息ID 是為一樣,一樣的話把內容取出來顯示即可
『伍』 為什麼我的樹莓派python+opencv imshow顯示不了窗口
使用cvWaitKey();這個函數,按照下面添加cvWaitKey();函數後,可以正常運行。
// ImageFlip.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include "opencv/cv.h"#include "opencv/highgui.h"#include "stdio.h"#include "iostream"using namespace cv;using namespace std;int _tmain(int argc, _TCHAR* argv[]){ Mat src = imread("lena.jpg"); Mat dst; transpose(src, dst); Mat dst2; flip(dst, dst2, 1); // flip by y axis Mat dst3; flip(dst, dst3, 0); // flip by x axis Mat dst4; flip(dst, dst4, -1); // flip by both axises imshow("src", src); imshow("dst", dst); imshow("dst2", dst2); imshow("dst3", dst3); imshow("dst4", dst4); cvWaitKey(); return 0;}
至於為什麼,好像是說和windows的PAINT事件相關,反正先加上使用吧。
『陸』 python opencv中imshow輸出圖像太大,如何調整輸出尺寸
通過resize重置圖片尺寸
參數:圖片,輸出圖片尺寸(一般我不用這個,我傳None),寬的比例,高的比例
例子:將圖片img,縮小一半顯示,那麼寬高為原尺寸的0.5倍
img = cv2.resize(img,None,fx=0.5,fy=0.5)
設置完尺寸後再顯示
cv2.imshow('img',img)
cv2.waitKey(0)
.......
希望我的回答對你有幫助!
『柒』 在python Image中可以用show()來顯示圖片,但是顯示以後,下面的代碼就不運行了,如何運行下面的代碼
Image.show()函數是這個樣子的,必須先關了圖片程序才往下走。
不使用show,如imshow(BW)在 Matlab 7.0 中,二進制圖像是一個邏輯類,僅包括 0 和 1 兩個數值。像素 0 顯示為黑色,像素 1 顯示為白色。顯示時,也可通過NOT(~)命令,對二進制圖象進行取反,使數值 0 顯示為白色;1 顯示為黑色。
例如: imshow(~BW)
擴展資料:
不使用show函數來滿足運行的需求:
import threading
import Image
class ThreadClass(threading.Thread):
def run(self):
im=Image.open('z.jpg')
im.show()
print (1)
t = ThreadClass()
t.start()
print (2)
a=input('End')
#===============================
圖像的表示原理:
最基本的物理圖像是根據矩形網格抽樣原理從連續圖像域中抽取二維灰度陣列(矩陣)得到的。也可以用長向量表示二維灰度矩陣,它是按列(或行)掃描灰度矩陣,把下一列(或行)的頭和前一列(或行)的尾相接而成。
它們的線性可逆變換同樣可以用來表示圖像。圖像的每一行由行程(具有同一灰度的鄰近像元集合)序列所組成,因此也可以用行程長度編碼(見圖像編碼)表示圖像。
『捌』 python 中有沒有imshowpair類似功能函數
題主最好給出一個稍微具體點的應用場景,可能有更加優化的方法。
我自己構造一個簡單的例子如下:
matlab: A = find(B>0)
python: A = [i for i in range(len(B)) if B[i]>0]
另外注意,matlab里的數組索引從1開始,和python不同。
『玖』 如何在python中從調用cv2.imread()後得到的圖片中截取一塊矩形部分
1、首先導入os模塊。os模塊直接和操作系統聯系。
『拾』 Python在調用cv2.imshow()時出現的問題
先到文末下載opencv的安裝包。其實這個安裝包就是一個解壓縮。
我們在安裝包解壓的目錄找到這個文件
把這個文件拷貝到python的包安裝目錄下面
在python的shell導入cv2模塊試試,看是不是安裝好了。結果提示還需要安裝一個依賴包
好吧,還好之前有這個numpy的安裝包,直接安裝