繼之前搭建了Python+OpenCV的工作環(huán)境后,開始了Python環(huán)境下的圖像處理嘗試。
Matplotlib是一個Python下的圖形框架,可以很方便地進(jìn)行圖形化顯示。可以說是做圖像處理和數(shù)據(jù)分析必裝的庫。
但就是這個庫的使用過程中,遇到了一個奇怪的問題。
1. 現(xiàn)象
在virtualenv建立的虛擬環(huán)境中,無法用matplotlib來顯示圖像。程序運(yùn)行正常,沒有任何錯誤信息,也可以保存圖像,但無法在交互模式中將圖像顯示在屏幕上。
但換到本機(jī)環(huán)境中就可以正常顯示。
2. 原因
查了好久,大體確認(rèn)是matplotlib的backend(后端)設(shè)置有問題。
關(guān)于什么是matplotlib的后端,請參考官方文檔。簡單地理解,后端就是一個渲染器,用于將前端代碼渲染成我們想要的圖像。
我們可以查看一下目前的后端設(shè)置。
(cv)lai@Chen:~/work/cv$ python
Python 3.4.3+ (default, Oct 14 2015, 16:03:50)
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> matplotlib.get_backend()
'agg'
目前是agg,但為了正確將圖像顯示在屏幕上,需要設(shè)置為TkAgg。
3. 解決辦法
首先安裝幾個依賴庫。
$ sudo apt-get install tcl-dev tk-dev python-tk python3-tk
然后進(jìn)入虛擬環(huán)境,用pip卸載已經(jīng)安裝的matplotlib庫。
$ pip uninstall matplotlib
然后重新安裝matplotlib。
$ pip install matplotlib
參考的解決方案中是通過下載源碼來重新編譯安裝matplotlib,但我發(fā)現(xiàn)直接安裝預(yù)編譯的版本也可以實(shí)現(xiàn)。
再來看一下目前的后端設(shè)置。
(cv)lai@Chen:~/work/cv$ python
Python 3.4.3+ (default, Oct 14 2015, 16:03:50)
[GCC 5.2.1 20151010] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import matplotlib
>>> matplotlib.get_backend()
'TkAgg'
后端設(shè)置已經(jīng)被改過來了。
4. 測試
使用如下測試代碼,用于同時顯示原始圖片和快速傅里葉變換后的結(jié)果。
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('apple.jpg', 0)
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dft_shift = np.fft.fftshift(dft)
magnitude_spectrum = 20 * \
np.log(cv2.magnitude(dft_shift[:, :, 0], dft_shift[:, :, 1]))
plt.subplot(121).imshow(img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122).imshow(magnitude_spectrum, cmap='gray')
plt.title('Magnitude Spectrum'), plt.xticks([]), plt.yticks([])
plt.savefig('a.png', format='png')
plt.show()
顯示結(jié)果如下:

運(yùn)行結(jié)果
matplotlib可以正確地在屏幕上顯示圖像了。